Canguro.Commands.Model.JoinCmd.Intersect C# (CSharp) Метод

Intersect() публичный статический Метод

public static Intersect ( Canguro model, LineElement l1, LineElement l2 ) : Joint
model Canguro
l1 Canguro.Model.LineElement
l2 Canguro.Model.LineElement
Результат Joint
        public static Joint Intersect(Canguro.Model.Model model, LineElement l1, LineElement l2)
        {
            if (l1 != null && l2 != null && l1 != l2 && l1.I != l2.I && l1.J != l2.J && l1.I != l2.J && l1.J != l2.I)
            {
                float numer, denom;
                float d1, d2, d3, d4, d5;
                Vector3 p13 = l1.I.Position - l2.I.Position;
                Vector3 p21 = l1.J.Position - l1.I.Position;
                Vector3 p43 = l2.J.Position - l2.I.Position;

                d1 = p13.X * p43.X + p13.Y * p43.Y + p13.Z * p43.Z;
                d2 = p43.X * p21.X + p43.Y * p21.Y + p43.Z * p21.Z;
                d3 = p13.X * p21.X + p13.Y * p21.Y + p13.Z * p21.Z;
                d4 = p43.X * p43.X + p43.Y * p43.Y + p43.Z * p43.Z;
                d5 = p21.X * p21.X + p21.Y * p21.Y + p21.Z * p21.Z;

                denom = d5 * d4 - d2 * d2;
                if (Math.Abs(denom) < 0.0001)
                    return null;
                numer = d1 * d2 - d3 * d4;

                float r = numer / denom;
                float s = (d1 + d2 * r) / d4;

                float scale = model.UnitSystem.FromInternational(1, Canguro.Model.UnitSystem.Units.Distance);
                Vector3 pa = Vector3.Scale(l1.I.Position, scale) + Vector3.Scale(p21, r * scale);
                Vector3 pb = Vector3.Scale(l2.I.Position, scale) + Vector3.Scale(p43, s * scale);

                if (r > (-0.001) && r < 1.001 && s > (-0.001) && s < 1.001 && (pa - pb).Length() < 0.001 &&
                    ((pa - l1.I.Position).LengthSq() > 0.000001f) && ((pa - l1.J.Position).LengthSq() > 0.000001f) &&
                    ((pa - l2.I.Position).LengthSq() > 0.000001f) && ((pa - l2.J.Position).LengthSq() > 0.000001f))
                {
                    Joint joint = new Joint(pa.X, pa.Y, pa.Z);
                    model.JointList.Add(joint);
                    return joint;
                    //SplitCmd.Split(l1, joint, model);
                    //SplitCmd.Split(l2, joint, model);
                }
                //// Create magnet
                //PointMagnet intPtMagnet = new PointMagnet(l1.Position + Vector3.Scale(l1.Direction, r),
                //    PointMagnetType.Intersection);
                //if (intPtMagnet.Snap(activeView, e.Location) < SnapViewDistance)
                //{
                //    intPtMagnet.RelatedMagnets.Add(l1);
                //    intPtMagnet.RelatedMagnets.Add(l2);
                //    return intPtMagnet;
                //}
            }

            return null;
        }

Same methods

JoinCmd::Intersect ( Canguro model, IList joints, IList lines ) : void

Usage Example

Пример #1
0
        public override void Run(Canguro.Controller.CommandServices services)
        {
            List <Item>        selecton = services.GetSelection();
            List <Joint>       joints   = new List <Joint>();
            List <LineElement> lines    = new List <LineElement>();

            foreach (Item item in selecton)
            {
                if (item is Joint)
                {
                    joints.Add((Joint)item);
                }
                else if (item is LineElement)
                {
                    lines.Add((LineElement)item);
                }
            }

            JoinCmd.Intersect(services.Model, joints, lines);
        }