本文整理汇总了C#中Circle.ClosestParameter方法的典型用法代码示例。如果您正苦于以下问题:C# Circle.ClosestParameter方法的具体用法?C# Circle.ClosestParameter怎么用?C# Circle.ClosestParameter使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Circle
的用法示例。
在下文中一共展示了Circle.ClosestParameter方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: PlaneCircle
/// <summary>
/// Intersects a plane with a circle using exact calculations.
/// </summary>
/// <param name="plane">Plane to intersect.</param>
/// <param name="circle">Circe to intersect.</param>
/// <param name="firstCircleParameter">First intersection parameter on circle if successful or RhinoMath.UnsetValue if not.</param>
/// <param name="secondCircleParameter">Second intersection parameter on circle if successful or RhinoMath.UnsetValue if not.</param>
/// <returns>The type of intersection that occured.</returns>
public static PlaneCircleIntersection PlaneCircle(Plane plane, Circle circle, out double firstCircleParameter, out double secondCircleParameter)
{
firstCircleParameter = RhinoMath.UnsetValue;
secondCircleParameter = RhinoMath.UnsetValue;
if (plane.ZAxis.IsParallelTo(circle.Plane.ZAxis, RhinoMath.ZeroTolerance * Math.PI) != 0)
{
if (Math.Abs(plane.DistanceTo(circle.Center)) < RhinoMath.ZeroTolerance)
return PlaneCircleIntersection.Coincident;
return PlaneCircleIntersection.Parallel;
}
Line L;
//At this point, the PlanePlane should never fail since I already checked for parallellillity.
if (!PlanePlane(plane, circle.Plane, out L)) { return PlaneCircleIntersection.Parallel; }
double Lt = L.ClosestParameter(circle.Center);
Point3d Lp = L.PointAt(Lt);
double d = circle.Center.DistanceTo(Lp);
//If circle radius equals the projection distance, we have a tangent intersection.
if (Math.Abs(d - circle.Radius) < RhinoMath.ZeroTolerance)
{
circle.ClosestParameter(Lp, out firstCircleParameter);
secondCircleParameter = firstCircleParameter;
return PlaneCircleIntersection.Tangent;
}
//If circle radius too small to get an intersection, then abort.
if (d > circle.Radius) { return PlaneCircleIntersection.None; }
double offset = Math.Sqrt((circle.Radius * circle.Radius) - (d * d));
Vector3d dir = offset * L.UnitTangent;
if (!circle.ClosestParameter(Lp + dir, out firstCircleParameter)) { return PlaneCircleIntersection.None; }
if (!circle.ClosestParameter(Lp - dir, out secondCircleParameter)) { return PlaneCircleIntersection.None; }
return PlaneCircleIntersection.Secant;
}