public void NotEquals_FalseForEqual()
        {
            var a = new LineSegment3(new Vector3(1, 2, 3), new Vector3(4, 5, 6));
            var b = a;

            Assert.IsFalse(a != b);
        }
        public void NotEquals_TrueForNotEqual()
        {
            var a = new LineSegment3(new Vector3(1, 2, 3), new Vector3(4, 5, 6));
            var b = new LineSegment3(new Vector3(6, 5, 4), new Vector3(3, 2, 1));

            Assert.IsTrue(a != b);
        }
        public void GetHashCode_SameForEqual()
        {
            var a = new LineSegment3(new Vector3(1, 2, 3), new Vector3(4, 5, 6));
            var b = new LineSegment3(new Vector3(1, 2, 3), new Vector3(4, 5, 6));

            Assert.AreEqual(a.GetHashCode(), b.GetHashCode());
        }
示例#4
0
        public Angle MaximalAngleWith(LineSegment3 line)
        {
            if (!this.valid)
            {
                return(Angle.ZERO);
            }

            return(this.direction.MaximalAngleWithAxis(line.VectorAB));
        }
        public void Equals_FalseForNotEqual()
        {
            var a = new LineSegment3(new Vector3(1, 2, 3), new Vector3(4, 5, 6));
            var b = new LineSegment3(new Vector3(6, 5, 4), new Vector3(3, 2, 1));

            Assert.IsFalse(a.Equals(b));
            Assert.IsFalse(a.Equals((object)b));
            Assert.IsFalse(a == b);
        }
示例#6
0
        public LineSegment3 Reflect(LineSegment3 segment)
        {
            if (!this.valid)
            {
                return(segment);
            }

            return(new LineSegment3(Reflect(segment.A), Reflect(segment.B)));
        }
        public void Equals_TrueForEqual()
        {
            var a = new LineSegment3(new Vector3(1, 2, 3), new Vector3(4, 5, 6));
            var b = a;

            Assert.IsTrue(a.Equals(b));
            Assert.IsTrue(a.Equals((object)b));
            Assert.IsTrue(a == b);
        }
示例#8
0
        public RayHitResult HitWithClick(RayCastInfo clickInfo)
        {
            var globalRay     = clickInfo.GlobalRay;
            var sphere        = getSphere(master);
            var segmentLength = (sphere.Center - globalRay.Point).Length() * 3;
            var segment       = new LineSegment3(globalRay.Point, globalRay.Point + globalRay.Direction * segmentLength);

            sphere.Intersect(segment, out var p1, out var p2);

            if (!p1.HasValue)
            {
                return(RayHitResult.Failure());
            }
            var d1 = (p1.Value - globalRay.Point).Length();

            Vector3 globalPoint;
            float   distance;

            if (p2.HasValue)
            {
                var d2   = (p2.Value - globalRay.Point).Length();
                var use1 = (d1 <= d2) ^ inverted;
                if (use1)
                {
                    globalPoint = p1.Value;
                    distance    = d1;
                }
                else
                {
                    globalPoint = p2.Value;
                    distance    = d2;
                }
            }
            else
            {
                globalPoint = p1.Value;
                distance    = d1;
            }

            // todo: consider rotation
            var localPoint = (globalPoint - sphere.Center) / sphere.Radius;

            return(new RayHitResult
            {
                Successful = true,
                Node = Node,
                Distance = distance,
                GlobalHitPoint = globalPoint,
                LocalHitPoint = localPoint,
                IntTag = intTag,
                StrTag = strTag
            });
        }
示例#9
0
        private static List <Polygon3> GenerateContourScaffolding(List <Mesh3> regions, float plateSpacing, Point3Tree <List <Polygon3> > edgeFacetIndex)
        {
            List <Polygon3> scaffolding = new List <Polygon3>();

            foreach (Mesh3 region in regions)
            {
                foreach (Polygon3 facet in region.Facets)
                {
                    for (int i = 0; i != facet.EdgeMidPoints.Length; i++)
                    {
                        if (edgeFacetIndex[facet.EdgeMidPoints[i]].Count == 1)
                        {
                            LineSegment3 boundingEdge = facet.Edges[i];
                            scaffolding.AddRange(CreateTesselatedLineSupport(new List <Point3> {
                                boundingEdge.StartPoint, boundingEdge.EndPoint
                            }, plateSpacing, region));
                        }
                    }
                }
            }
            return(scaffolding);
        }
示例#10
0
        // ========================================================

        public bool IsEqualTo(LineSegment3 line)
        {
            return((A.IsEqualTo(line.A) && B.IsEqualTo(line.B)) || (A.IsEqualTo(line.B) && B.IsEqualTo(line.A)));
        }
示例#11
0
 public static LineSegment3 TurnAt90Degrees(LineSegment3 segment)
 {
     return(new LineSegment3(TurnAt90Degrees(segment.A), TurnAt90Degrees(segment.B)));
 }
示例#12
0
 public static LineSegment3 Reflect(LineSegment3 segment)
 {
     return(new LineSegment3(Reflect(segment.A), Reflect(segment.B)));
 }
 public BuildingWallSegment(Vector3 p1, Vector3 p2, float height)
 {
     Basement = new LineSegment3(p1, p2);
     Height   = height;
 }
示例#14
0
 public LineSegment3(LineSegment3 line)
 {
     this.A = line.A;
     this.B = line.B;
 }
示例#15
0
 public bool IsParallelTo(LineSegment3 segment)
 {
     return(this.valid && this.direction.IsParallelTo(segment.VectorAB));
 }
示例#16
0
 public bool IsOrthogonalTo(LineSegment3 segment)
 {
     return(this.valid && this.direction.IsOrthogonalTo(segment.VectorAB));
 }
示例#17
0
 /// <summary>
 /// Helper - returns the closest point on this curve to a line
 /// </summary>
 public float FindClosestPoint( LineSegment3 line, int iterations )
 {
     return FindClosestPoint( new DistanceToPointDelegate( line.GetSqrDistanceToPoint ), iterations );
 }
示例#18
0
 public bool IsParallelTo(LineSegment3 segment)
 {
     return((B - A).IsParallelTo(segment.B - segment.A));
 }
示例#19
0
 public bool IsOrthogonalTo(LineSegment3 segment)
 {
     return((B - A).IsOrthogonalTo(segment.B - segment.A));
 }
        private static void GetExternalPart(LineSegment3 segment, BuildingPrimitive primitive, List <LineSegment3> results)
        {
            var invTransform   = primitive.Transform.Invert();
            var transformedSeg = new LineSegment3(segment.Point1 * invTransform, segment.Point2 * invTransform);
            var seg            = new LineSegment2(transformedSeg.Point1.Xz, transformedSeg.Point2.Xz);

            if (primitive.Type == BuildingPrimitiveType.Rectangle)
            {
                var rect     = new AaRectangle2(Vector2.Zero, primitive.Scale.X, primitive.Scale.Z);
                var conains1 = rect.ContainsPoint(seg.Point1);
                var conains2 = rect.ContainsPoint(seg.Point2);
                if (conains1 && conains2)
                {
                    return;
                }
                if (!conains1 && !conains2)
                {
                    var p = Vector2.Zero;
                    int c = 0;
                    foreach (var rectSegment in rect.GetSegments())
                    {
                        var rsi = rectSegment.Intersect(seg);
                        if (rsi.HasValue)
                        {
                            p += rsi.Value;
                            c++;
                        }
                    }

                    if (c > 0)
                    {
                        var t = ((p / c) - seg.Point1).Length() / (seg.Point2 - seg.Point1).Length();
                        var m = segment.Point1 + (segment.Point2 - segment.Point1) * t;
                        GetExternalPart(new LineSegment3(segment.Point1, m), primitive, results);
                        GetExternalPart(new LineSegment3(m, segment.Point2), primitive, results);
                        return;
                    }

                    results.Add(segment);
                    return;
                }

                var swap = conains1;
                if (swap)
                {
                    CodingHelper.Swap(ref seg.Point1, ref seg.Point2);
                }
                var inter = seg.Intersect(new LineSegment2(
                                              new Vector2(-primitive.Scale.X, -primitive.Scale.Z),
                                              new Vector2(-primitive.Scale.X, primitive.Scale.Z)));
                if (inter.HasValue)
                {
                    var rs1 = To3(seg.Point1, inter.Value, primitive.Transform, swap);
                    results.Add(rs1);
                    return;
                }
                inter = seg.Intersect(new LineSegment2(
                                          new Vector2(primitive.Scale.X, -primitive.Scale.Z),
                                          new Vector2(primitive.Scale.X, primitive.Scale.Z)));
                if (inter.HasValue)
                {
                    var rs1 = To3(seg.Point1, inter.Value, primitive.Transform, swap);
                    results.Add(rs1);
                    return;
                }
                inter = seg.Intersect(new LineSegment2(
                                          new Vector2(-primitive.Scale.X, primitive.Scale.Z),
                                          new Vector2(primitive.Scale.X, primitive.Scale.Z)));
                if (inter.HasValue)
                {
                    var rs1 = To3(seg.Point1, inter.Value, primitive.Transform, swap);
                    results.Add(rs1);
                    return;
                }
                inter = seg.Intersect(new LineSegment2(
                                          new Vector2(-primitive.Scale.X, -primitive.Scale.Z),
                                          new Vector2(primitive.Scale.X, -primitive.Scale.Z)));
                if (inter.HasValue)
                {
                    var rs1 = To3(seg.Point1, inter.Value, primitive.Transform, swap);
                    results.Add(rs1);
                    return;
                }

                var rs2 = segment;
                results.Add(rs2);
                return;
            }
            else
            {
                var circle = new Circle2(Vector2.Zero, primitive.Scale.X);

                var conains1 = circle.Contains(seg.Point1);
                var conains2 = circle.Contains(seg.Point2);
                if (conains1 && conains2)
                {
                    return;
                }
                if (!conains1 && !conains2)
                {
                    var rs1 = segment;
                    results.Add(rs1);
                    return;
                }

                var swap = conains1;
                if (swap)
                {
                    CodingHelper.Swap(ref seg.Point1, ref seg.Point2);
                }

                var dpp   = seg.Point2 - seg.Point1;
                var dpc   = seg.Point1;
                var a     = dpp.LengthSquared();
                var b     = Vector2.Dot(dpp, dpc);
                var c     = dpc.LengthSquared() - circle.Radius.Sq();
                var discr = b * b - a * c;
                if (discr < 0)
                {
                    results.Add(segment);
                    return;
                }
                if (discr < MathHelper.Eps5)
                {
                    results.Add(segment);
                    return;
                    //var l = -b / a;
                    //if (0 <= l && l <= 1)
                }
                {
                    var sqrdscr = MathHelper.Sqrt(discr);
                    var l1      = (-b + sqrdscr) / a;
                    var l2      = (-b - sqrdscr) / a;
                    if (0 <= l1 && l1 <= 1)
                    {
                        var rs1 = To3(seg.Point1, Vector2.Lerp(seg.Point1, seg.Point2, l1), primitive.Transform, swap);
                        results.Add(rs1);
                    }

                    if (0 <= l2 && l2 <= 1)
                    {
                        var rs1 = To3(seg.Point1, Vector2.Lerp(seg.Point1, seg.Point2, l2), primitive.Transform, swap);
                        results.Add(rs1);
                    }
                }
            }
        }
示例#21
0
 public Angle MaximalAngleWith(LineSegment3 line)
 {
     return(this.VectorAB.MaximalAngleWithAxis(line.VectorAB));
 }