public List<OwnVector3> createCornerSegment(OwnVector3 centerPoint, OwnVector3 previousPoint, OwnVector3 nextPoint) { OwnVector3 direction = centerPoint - previousPoint; OwnVector3 norDirection = direction / direction.Length(); OwnVector3 direction2 = centerPoint - nextPoint; OwnVector3 norDirection2 = direction2 / direction2.Length(); OwnVector3 startPoint = OwnVector3.Lerp(centerPoint, previousPoint, 0.5f); OwnVector3 endPoint = OwnVector3.Lerp(centerPoint, nextPoint, 0.5f); List<OwnVector3> ret = new List<OwnVector3>(); OwnVector2 vector1 = new OwnVector2(previousPoint.X, previousPoint.Y) - new OwnVector2(centerPoint.X, centerPoint.Y); OwnVector2 vector2 = new OwnVector2(nextPoint.X, nextPoint.Y) - new OwnVector2(centerPoint.X, centerPoint.Y); float angle = MathHelper.ToDegrees((float)MathUtils.VectorAngle(ref vector1, ref vector2)); if (105 < angle || angle < -150) { OwnVector3 p1 = DrawTools.MoveForward(startPoint, DrawTools.TurnLeft(90, norDirection), distance); OwnVector3 p2 = DrawTools.MoveForward(endPoint, DrawTools.TurnRight(90, norDirection2), distance); OwnVector3 temp = OwnVector3.Lerp(p1, p2, 0.5f); OwnVector3 tempDirection = temp - p1; OwnVector3 tempNorDirection = tempDirection / tempDirection.Length(); OwnVector3 p3 = DrawTools.MoveForward(temp, DrawTools.TurnRight(90, tempNorDirection), distance * 2); ret.Add(p1); ret.Add(p3); ret.Add(p3); ret.Add(p2); } else if (angle < 0) { OwnVector3 p1, p2, p3, p4; p1 = DrawTools.MoveForward(startPoint, DrawTools.TurnLeft(90, norDirection), distance); p2 = DrawTools.MoveForward(centerPoint, DrawTools.TurnRight(90, norDirection), distance); p3 = DrawTools.MoveForward(centerPoint, DrawTools.TurnLeft(90, norDirection2), distance); p4 = DrawTools.MoveForward(endPoint, DrawTools.TurnRight(90, norDirection2), distance); ret.Add(p1); ret.Add(p2); ret.Add(p2); ret.Add(p3); ret.Add(p3); ret.Add(p4); } else { OwnVector3 p1, p2; p1 = DrawTools.MoveForward(startPoint, DrawTools.TurnLeft(90, norDirection), distance); p2 = DrawTools.MoveForward(endPoint, DrawTools.TurnRight(90, norDirection2), distance); ret.Add(p1); ret.Add(p2); } return ret; }
public static float DistanceBetweenPointAndLineSegment(ref OwnVector2 point, ref OwnVector2 start, ref OwnVector2 end) { if (start == end) return OwnVector2.Distance(point, start); OwnVector2 v = OwnVector2.Subtract(end, start); OwnVector2 w = OwnVector2.Subtract(point, start); float c1 = OwnVector2.Dot(w, v); if (c1 <= 0) return OwnVector2.Distance(point, start); float c2 = OwnVector2.Dot(v, v); if (c2 <= c1) return OwnVector2.Distance(point, end); float b = c1 / c2; OwnVector2 pointOnLine = OwnVector2.Add(start, OwnVector2.Multiply(v, b)); return OwnVector2.Distance(point, pointOnLine); }
// // Summary: // Multiplies the components of two vectors by each other. // // Parameters: // value1: // Source vector. // // value2: // Source vector. // // result: // [OutAttribute] The result of the multiplication. public static void Multiply(ref OwnVector2 value1, ref OwnVector2 value2, out OwnVector2 result) { result = new OwnVector2(Vector2.Multiply(value1.vector, value2.vector)); }
// // Summary: // Calculates the distance between two vectors squared. // // Parameters: // value1: // Source vector. // // value2: // Source vector. // // result: // [OutAttribute] The distance between the vectors squared. public static void DistanceSquared(ref OwnVector2 value1, ref OwnVector2 value2, out float result) { result = Vector2.DistanceSquared(value1.vector, value2.vector); }
// // Summary: // Multiplies a vector by a scalar value. // // Parameters: // value1: // Source vector. // // scaleFactor: // Scalar value. // // result: // [OutAttribute] The result of the multiplication. public static void Multiply(ref OwnVector2 value1, float scaleFactor, out OwnVector2 result) { result = new OwnVector2(Vector2.Multiply(value1.vector, scaleFactor)); }
// // Summary: // Interpolates between two values using a cubic equation. // // Parameters: // value1: // Source value. // // value2: // Source value. // // amount: // Weighting value. // // result: // [OutAttribute] The interpolated value. public static void SmoothStep(ref OwnVector2 value1, ref OwnVector2 value2, float amount, out OwnVector2 result) { result = new OwnVector2(Vector2.SmoothStep(value1.vector, value2.vector, amount)); }
// // Summary: // Subtracts a vector from a vector. // // Parameters: // value1: // Source vector. // // value2: // Source vector. // // result: // [OutAttribute] The result of the subtraction. public static void Subtract(ref OwnVector2 value1, ref OwnVector2 value2, out OwnVector2 result) { result = new OwnVector2(Vector2.Subtract(value1.vector, value2.vector)); }
// // Summary: // Creates a unit vector from the specified vector, writing the result to a // user-specified variable. The result is a vector one unit in length pointing // in the same direction as the original vector. // // Parameters: // value: // Source vector. // // result: // [OutAttribute] Normalized vector. public static void Normalize(ref OwnVector2 value, out OwnVector2 result) { result = new OwnVector2(Vector2.Normalize(value.vector)); }
// // Summary: // Determines the reflect vector of the given vector and normal. // // Parameters: // vector: // Source vector. // // normal: // Normal of vector. // // result: // [OutAttribute] The created reflect vector. public static void Reflect(ref OwnVector2 vector, ref OwnVector2 normal, out OwnVector2 result) { result = new OwnVector2(Vector2.Reflect(vector.vector, normal.vector)); }
// // Summary: // Calculates the dot product of two vectors and writes the result to a user-specified // variable. If the two vectors are unit vectors, the dot product returns a // floating point value between -1 and 1 that can be used to determine some // properties of the angle between two vectors. For example, it can show whether // the vectors are orthogonal, parallel, or have an acute or obtuse angle between // them. // // Parameters: // value1: // Source vector. // // value2: // Source vector. // // result: // [OutAttribute] The dot product of the two vectors. public static void Dot(ref OwnVector2 value1, ref OwnVector2 value2, out float result) { result = Vector2.Dot(value1.vector, value2.vector); }
// // Summary: // Performs a Hermite spline interpolation. // // Parameters: // value1: // Source position vector. // // tangent1: // Source tangent vector. // // value2: // Source position vector. // // tangent2: // Source tangent vector. // // amount: // Weighting factor. public static OwnVector2 Hermite(OwnVector2 value1, OwnVector2 tangent1, OwnVector2 value2, OwnVector2 tangent2, float amount) { return new OwnVector2(Vector2.Hermite(value1.vector, tangent1.vector, value2.vector, tangent2.vector, amount)); }
// // Summary: // Divides the components of a vector by the components of another vector. // // Parameters: // value1: // Source vector. // // value2: // The divisor. // // result: // [OutAttribute] The result of the division. public static void Divide(ref OwnVector2 value1, ref OwnVector2 value2, out OwnVector2 result) { result = new OwnVector2(Vector2.Divide(value1.vector, value2.vector)); }
// // Summary: // Calculates the dot product of two vectors. If the two vectors are unit vectors, // the dot product returns a floating point value between -1 and 1 that can // be used to determine some properties of the angle between two vectors. For // example, it can show whether the vectors are orthogonal, parallel, or have // an acute or obtuse angle between them. // // Parameters: // value1: // Source vector. // // value2: // Source vector. public static float Dot(OwnVector2 value1, OwnVector2 value2) { return Vector2.Dot(value1.vector, value2.vector); }
// // Summary: // Divides a vector by a scalar value. // // Parameters: // value1: // Source vector. // // divider: // The divisor. // // result: // [OutAttribute] The result of the division. public static void Divide(ref OwnVector2 value1, float divider, out OwnVector2 result) { result = new OwnVector2(Vector2.Divide(value1.vector, divider)); }
// // Summary: // Divides the components of a vector by the components of another vector. // // Parameters: // value1: // Source vector. // // value2: // Divisor vector. public static OwnVector2 Divide(OwnVector2 value1, OwnVector2 value2) { return new OwnVector2(Vector2.Divide(value1.vector, value2.vector)); }
// // Summary: // Divides a vector by a scalar value. // // Parameters: // value1: // Source vector. // // divider: // The divisor. public static OwnVector2 Divide(OwnVector2 value1, float divider) { return new OwnVector2(Vector2.Divide(value1.vector, divider)); }
// // Summary: // Returns a vector pointing in the opposite direction. // // Parameters: // value: // Source vector. public static OwnVector2 Negate(OwnVector2 value) { return new OwnVector2(Vector2.Negate(value.vector)); }
// // Summary: // Performs a Hermite spline interpolation. // // Parameters: // value1: // Source position vector. // // tangent1: // Source tangent vector. // // value2: // Source position vector. // // tangent2: // Source tangent vector. // // amount: // Weighting factor. // // result: // [OutAttribute] The result of the Hermite spline interpolation. public static void Hermite(ref OwnVector2 value1, ref OwnVector2 tangent1, ref OwnVector2 value2, ref OwnVector2 tangent2, float amount, out OwnVector2 result) { result = new OwnVector2(Vector2.Hermite(value1.vector, tangent1.vector, value2.vector, tangent2.vector, amount)); }
// // Summary: // Creates a unit vector from the specified vector. The result is a vector one // unit in length pointing in the same direction as the original vector. // // Parameters: // value: // Source Vector2. public static OwnVector2 Normalize(OwnVector2 value) { return new OwnVector2(Vector2.Normalize(value.vector)); }
// // Summary: // Performs a linear interpolation between two vectors. // // Parameters: // value1: // Source vector. // // value2: // Source vector. // // amount: // Value between 0 and 1 indicating the weight of value2. public static OwnVector2 Lerp(OwnVector2 value1, OwnVector2 value2, float amount) { return new OwnVector2(Vector2.Lerp(value1.vector, value2.vector, amount)); }
// // Summary: // Determines the reflect vector of the given vector and normal. // // Parameters: // vector: // Source vector. // // normal: // Normal of vector. public static OwnVector2 Reflect(OwnVector2 vector, OwnVector2 normal) { return new OwnVector2(Vector2.Reflect(vector.vector, normal.vector)); }
// // Summary: // Returns a vector that contains the lowest value from each matching pair of // components. // // Parameters: // value1: // Source vector. // // value2: // Source vector. public static OwnVector2 Min(OwnVector2 value1, OwnVector2 value2) { return new OwnVector2(Vector2.Min(value1.vector, value2.vector)); }
// // Summary: // Interpolates between two values using a cubic equation. // // Parameters: // value1: // Source value. // // value2: // Source value. // // amount: // Weighting value. public static OwnVector2 SmoothStep(OwnVector2 value1, OwnVector2 value2, float amount) { return new OwnVector2(Vector2.SmoothStep(value1.vector, value2.vector, amount)); }
public static bool PointInTriangle(OwnVector2 A, OwnVector2 B, OwnVector2 C, OwnVector2 P) { // Compute vectors OwnVector2 v0 = C - A; OwnVector2 v1 = B - A; OwnVector2 v2 = P - A; // Compute dot products float dot00 = OwnVector2.Dot(v0, v0); float dot01 = OwnVector2.Dot(v0, v1); float dot02 = OwnVector2.Dot(v0, v2); float dot11 = OwnVector2.Dot(v1, v1); float dot12 = OwnVector2.Dot(v1, v2); // Compute barycentric coordinates float invDenom = 1 / (dot00 * dot11 - dot01 * dot01); float u = (dot11 * dot02 - dot01 * dot12) * invDenom; float v = (dot00 * dot12 - dot01 * dot02) * invDenom; // Check if point is in triangle return (u >= 0) && (v >= 0) && (u + v < 1); }
// // Summary: // Subtracts a vector from a vector. // // Parameters: // value1: // Source vector. // // value2: // Source vector. public static OwnVector2 Subtract(OwnVector2 value1, OwnVector2 value2) { return new OwnVector2(Vector2.Subtract(value1.vector, value2.vector)); }
// // Summary: // Restricts a value to be within a specified range. // // Parameters: // value1: // The value to clamp. // // min: // The minimum value. // // max: // The maximum value. // // result: // [OutAttribute] The clamped value. public static void Clamp(ref OwnVector2 value1, ref OwnVector2 min, ref OwnVector2 max, out OwnVector2 result) { result = new OwnVector2(Vector2.Clamp(value1.vector, min.vector, max.vector)); }
// // Summary: // Multiplies a vector by a scalar value. // // Parameters: // value1: // Source vector. // // scaleFactor: // Scalar value. public static OwnVector2 Multiply(OwnVector2 value1, float scaleFactor) { return new OwnVector2(Vector2.Multiply(value1.vector, scaleFactor)); }
// // Summary: // Calculates the distance between two vectors squared. // // Parameters: // value1: // Source vector. // // value2: // Source vector. public static float DistanceSquared(OwnVector2 value1, OwnVector2 value2) { return Vector2.DistanceSquared(value1.vector, value2.vector); }
private List<OwnVector3> createCorner2(OwnVector3 centerPoint, OwnVector3 previousPoint, OwnVector3 nextPoint) { OwnVector2 vector1 = new OwnVector2(previousPoint.X, previousPoint.Y) - new OwnVector2(centerPoint.X, centerPoint.Y); OwnVector2 vector2 = new OwnVector2(nextPoint.X, nextPoint.Y) - new OwnVector2(centerPoint.X, centerPoint.Y); float angle = (float)MathUtils.VectorAngle(ref vector1, ref vector2); List<OwnVector3> ret = new List<OwnVector3>(); OwnVector3 direction = centerPoint - previousPoint; OwnVector3 norDirection = direction / direction.Length(); OwnVector3 direction2 = centerPoint - nextPoint; OwnVector3 norDirection2 = direction2 / direction2.Length(); OwnVector3 startPoint = OwnVector3.Lerp(centerPoint, previousPoint, 0.5f); OwnVector3 endPoint = OwnVector3.Lerp(centerPoint, nextPoint, 0.5f); OwnVector3 upper1, upper2, upper3, lower1, lower2, intersectionPoint, intersectionPoint2; if (angle > 0) { upper2 = DrawTools.MoveForward(startPoint, DrawTools.TurnLeft(90, norDirection), distance * 2); upper3 = DrawTools.MoveForward(endPoint, DrawTools.TurnRight(90, norDirection2), distance * 2); intersectionPoint = new OwnVector3(LineTools.LineIntersect( new Point2D(upper2.X, upper2.Y), new Point2D(upper2.X + norDirection.X, upper2.Y + norDirection.Y), new Point2D(upper3.X, upper3.Y), new Point2D(upper3.X + norDirection2.X, upper3.Y + norDirection2.Y)), 0); if (OwnVector3.Distance(centerPoint, intersectionPoint) > distance * 3) { upper1 = DrawTools.MoveForward(centerPoint, DrawTools.TurnLeft(MathHelper.ToDegrees(angle / 2), norDirection), distance * 3); } else { upper1 = intersectionPoint; } lower1 = DrawTools.MoveBackward(startPoint, DrawTools.TurnLeft(90, norDirection), distance * 2); lower2 = DrawTools.MoveBackward(endPoint, DrawTools.TurnRight(90, norDirection2), distance * 2); intersectionPoint2 = new OwnVector3(LineTools.LineIntersect( new Point2D(lower1.X, lower1.Y), new Point2D(lower1.X + norDirection.X, lower1.Y + norDirection.Y), new Point2D(lower2.X, lower2.Y), new Point2D(lower2.X + norDirection2.X, lower2.Y + norDirection2.Y)), 0); } else { upper1 = upper2 = DrawTools.MoveForward(startPoint, DrawTools.TurnRight(90, norDirection), distance * 2); upper3 = DrawTools.MoveForward(endPoint, DrawTools.TurnLeft(90, norDirection2), distance * 2); intersectionPoint = new OwnVector3(LineTools.LineIntersect( new Point2D(upper2.X, upper2.Y), new Point2D(upper2.X + norDirection.X, upper2.Y + norDirection.Y), new Point2D(upper3.X, upper3.Y), new Point2D(upper3.X + norDirection2.X, upper3.Y + norDirection2.Y)), 0); if (OwnVector3.Distance(centerPoint, intersectionPoint) > distance * 3) { upper1 = DrawTools.MoveForward(centerPoint, DrawTools.TurnLeft(MathHelper.ToDegrees(angle / 2), norDirection), distance * 3); } else { upper1 = intersectionPoint; } lower1 = DrawTools.MoveBackward(startPoint, DrawTools.TurnRight(90, norDirection), distance * 2); lower2 = DrawTools.MoveBackward(endPoint, DrawTools.TurnLeft(90, norDirection2), distance * 2); intersectionPoint2 = new OwnVector3(LineTools.LineIntersect( new Point2D(lower1.X, lower1.Y), new Point2D(lower1.X + norDirection.X, lower1.Y + norDirection.Y), new Point2D(lower2.X, lower2.Y), new Point2D(lower2.X + norDirection2.X, lower2.Y + norDirection2.Y)), 0); } ret.Add(upper2); ret.Add(upper1); ret.Add(upper1); ret.Add(upper3); bool testValue = (OwnVector3.Distance(intersectionPoint2, centerPoint) <= Math.Sqrt(Math.Pow(distance * 2, 2) + Math.Pow(OwnVector3.Distance(startPoint, centerPoint), 2))); if (testValue) { ret.Add(lower1); ret.Add(intersectionPoint2); ret.Add(intersectionPoint2); ret.Add(lower2); } OwnVector3 start2 = OwnVector3.Lerp(startPoint, centerPoint, 0.5f); OwnVector3 end2 = OwnVector3.Lerp(endPoint, centerPoint, 0.5f); OwnVector3 p1, p2, p3, p4, p5, p6; if (angle > 0) { p3 = DrawTools.MoveForward(centerPoint, DrawTools.TurnLeft(MathHelper.ToDegrees(angle / 2), norDirection), OwnVector3.Distance(centerPoint, upper1) / 2); p6 = DrawTools.MoveBackward(centerPoint, DrawTools.TurnLeft(MathHelper.ToDegrees(angle / 2), norDirection), OwnVector3.Distance(centerPoint, intersectionPoint2) / 2); } else { p3 = DrawTools.MoveBackward(centerPoint, DrawTools.TurnLeft(MathHelper.ToDegrees(angle / 2), norDirection), OwnVector3.Distance(centerPoint, intersectionPoint2) / 2); p6 = DrawTools.MoveForward(centerPoint, DrawTools.TurnLeft(MathHelper.ToDegrees(angle / 2), norDirection), OwnVector3.Distance(centerPoint, upper1) / 2); } if (testValue) { p1 = DrawTools.MoveForward(start2, DrawTools.TurnLeft(90, norDirection), distance); p2 = DrawTools.MoveForward(start2, DrawTools.TurnRight(90, norDirection), distance); ret.Add(p1); ret.Add(p2); ret.Add(previousPoint - (startPoint - previousPoint)); ret.Add(OwnVector3.Lerp(p1,p2, 0.5f)); p4 = DrawTools.MoveForward(end2, DrawTools.TurnLeft(90, norDirection2), distance); p5 = DrawTools.MoveForward(end2, DrawTools.TurnRight(90, norDirection2), distance); ret.Add(p4); ret.Add(p5); ret.Add(nextPoint + (nextPoint - endPoint)); ret.Add(OwnVector3.Lerp(p4, p5, 0.5f)); ret.Add(p1); ret.Add(p3); ret.Add(p3); ret.Add(p5); ret.Add(p2); ret.Add(p6); ret.Add(p6); ret.Add(p4); ret.Add(DrawTools.MoveBackward(upper2, norDirection, OwnVector3.Distance(previousPoint, startPoint) * 2)); ret.Add(upper2); ret.Add(DrawTools.MoveBackward(lower1, norDirection, OwnVector3.Distance(previousPoint, startPoint) * 2)); ret.Add(lower1); ret.Add(DrawTools.MoveBackward(upper3, norDirection2, OwnVector3.Distance(endPoint, nextPoint) * 2)); ret.Add(upper3); ret.Add(DrawTools.MoveBackward(lower2, norDirection2, OwnVector3.Distance(endPoint, nextPoint) * 2)); ret.Add(lower2); } else { ret.Add(DrawTools.MoveBackward(upper2, norDirection, OwnVector3.Distance(previousPoint, startPoint) * 2)); ret.Add(upper2); ret.Add(DrawTools.MoveBackward(lower1, norDirection, OwnVector3.Distance(previousPoint, startPoint) * 2)); ret.Add(intersectionPoint2); ret.Add(DrawTools.MoveBackward(upper3, norDirection2, OwnVector3.Distance(endPoint, nextPoint) * 2)); ret.Add(upper3); ret.Add(DrawTools.MoveBackward(lower2, norDirection2, OwnVector3.Distance(endPoint, nextPoint) * 2)); ret.Add(intersectionPoint2); if (angle > 0) { p1 = DrawTools.MoveForward(start2, DrawTools.TurnLeft(90, norDirection), distance); p2 = DrawTools.MoveForward(end2, DrawTools.TurnRight(90, norDirection2), distance); OwnVector2 intersect = LineTools.LineIntersect(new Point2D(p1.X, p1.Y), new Point2D(p6.X, p6.Y), new Point2D(startPoint.X, startPoint.Y), new Point2D(centerPoint.X, centerPoint.Y)); ret.Add(previousPoint - (startPoint - previousPoint)); ret.Add(new OwnVector3(intersect.X, intersect.Y, 0)); intersect = LineTools.LineIntersect(new Point2D(p2.X, p2.Y), new Point2D(p6.X, p6.Y), new Point2D(endPoint.X, endPoint.Y), new Point2D(centerPoint.X, centerPoint.Y)); ret.Add(nextPoint + (nextPoint - endPoint)); ret.Add(new OwnVector3(intersect.X, intersect.Y, 0)); ret.Add(p1); ret.Add(p6); ret.Add(p6); ret.Add(p2); ret.Add(p1); ret.Add(p3); ret.Add(p3); ret.Add(p2); } else { p1 = DrawTools.MoveForward(start2, DrawTools.TurnRight(90, norDirection), distance); p2 = DrawTools.MoveForward(end2, DrawTools.TurnLeft(90, norDirection2), distance); OwnVector2 intersect = LineTools.LineIntersect(new Point2D(p1.X, p1.Y), new Point2D(p3.X, p3.Y), new Point2D(startPoint.X, startPoint.Y), new Point2D(centerPoint.X, centerPoint.Y)); ret.Add(previousPoint - (startPoint - previousPoint)); ret.Add(new OwnVector3(intersect.X, intersect.Y, 0)); intersect = LineTools.LineIntersect(new Point2D(p2.X, p2.Y), new Point2D(p3.X, p3.Y), new Point2D(endPoint.X, endPoint.Y), new Point2D(centerPoint.X, centerPoint.Y)); ret.Add(nextPoint + (nextPoint - endPoint)); ret.Add(new OwnVector3(intersect.X, intersect.Y, 0)); ret.Add(DrawTools.MoveForward(start2, DrawTools.TurnRight(90, norDirection), distance)); ret.Add(p3); ret.Add(p3); ret.Add(DrawTools.MoveForward(end2, DrawTools.TurnLeft(90, norDirection2), distance)); ret.Add(DrawTools.MoveForward(start2, DrawTools.TurnRight(90, norDirection), distance)); ret.Add(p6); ret.Add(p6); ret.Add(DrawTools.MoveForward(end2, DrawTools.TurnLeft(90, norDirection2), distance)); } } return ret; }
// // Summary: // Multiplies the components of two vectors by each other. // // Parameters: // value1: // Source vector. // // value2: // Source vector. public static OwnVector2 Multiply(OwnVector2 value1, OwnVector2 value2) { return new OwnVector2(Vector2.Multiply(value1.vector, value2.vector)); }