本文整理汇总了C#中GeoLib.C2DPoint.Set方法的典型用法代码示例。如果您正苦于以下问题:C# C2DPoint.Set方法的具体用法?C# C2DPoint.Set怎么用?C# C2DPoint.Set使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类GeoLib.C2DPoint
的用法示例。
在下文中一共展示了C2DPoint.Set方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Distance
/// <summary>
/// Returns the distance from this to the point.
/// </summary>
/// <param name="TestPoint">The test pointt.</param>
/// <param name="ptOnThis">Output. The closest point on this.</param>
public override double Distance(C2DPoint TestPoint, C2DPoint ptOnThis)
{
C2DVector vP1ToPoint = new C2DVector(point, TestPoint);
double dLength = GetLength();
double dProjLength = vP1ToPoint.Dot(vector);
if (dProjLength < 0)
{
ptOnThis.Set(point);
return TestPoint.Distance(point);
}
else
{
dProjLength = dProjLength / dLength;
if (dProjLength < dLength)
{
// The projection is on the line
double dFactorOnLine = dProjLength / dLength;
C2DPoint PtOnLine = new C2DPoint(point.x + vector.i * dFactorOnLine,
point.y + vector.j * dFactorOnLine);
ptOnThis.Set(PtOnLine);
return TestPoint.Distance(PtOnLine);
}
else
{
ptOnThis .Set(GetPointTo());
return TestPoint.Distance( GetPointTo() );
}
}
}
示例2: Distance
/// <summary>
/// Distance to a another.
/// </summary>
/// <param name="Other">The other triangle.</param>
/// <param name="ptOnThis">Output. The closest point on the triangle.</param>
/// <param name="ptOnOther">Output. The closest point on the other triangle.</param>
public double Distance(C2DTriangle Other, C2DPoint ptOnThis, C2DPoint ptOnOther)
{
C2DPoint ptTemp = new C2DPoint();
double dMinDist = Distance(Other.P1, ptOnThis);
ptOnOther.Set( Other.P1 );
double dDist = Distance(Other.P2, ptTemp);
if (dDist < dMinDist)
{
ptOnOther.Set(Other.P2);
ptOnThis.Set(ptTemp);
dMinDist = dDist;
}
dDist = Distance(Other.P3, ptTemp);
if (dDist < dMinDist)
{
ptOnOther.Set( Other.P3);
ptOnThis.Set(ptTemp);
dMinDist = dDist;
}
dDist = Other.Distance(P1, ptTemp);
if (dDist < dMinDist)
{
ptOnOther.Set(ptTemp);
ptOnThis.Set(P1);
dMinDist = dDist;
}
dDist = Other.Distance(P2, ptTemp);
if (dDist < dMinDist)
{
ptOnOther.Set(ptTemp);
ptOnThis.Set(P2);
dMinDist = dDist;
}
dDist = Other.Distance(P3, ptTemp);
if (dDist < dMinDist)
{
ptOnOther.Set(ptTemp);
ptOnThis.Set(P3);
dMinDist = dDist;
}
return dMinDist;
}
示例3: DistanceAsRay
/// <summary>
/// Returns the distance from this to the point with this as a ray.
/// </summary>
/// <param name="TestPoint"></param>
/// <param name="ptOnThis"></param>
/// <returns></returns>
public double DistanceAsRay(C2DPoint TestPoint, C2DPoint ptOnThis)
{
C2DVector vP1ToPoint = new C2DVector(point, TestPoint);
// The projection is on the line
double dFactorOnLine = vP1ToPoint.Dot(vector) / (vector.i * vector.i + vector.j * vector.j);
ptOnThis.Set(point.x + vector.i * dFactorOnLine,
point.y + vector.j * dFactorOnLine);
return TestPoint.Distance(ptOnThis);
}
示例4: ProjectsOnLine
/// <summary>
/// True if the point projects onto the line given and returns the point on the line.
/// Also returns whether the line projects above or below the line if relevant.
/// </summary>
/// <param name="Line">The line to project this on.</param>
/// <param name="ptOnLine">The point to recieve the result.</param>
/// <param name="bAbove">The flag to indicate whether it projects above or below.</param>
public bool ProjectsOnLine(C2DLine Line, C2DPoint ptOnLine ,
ref bool bAbove)
{
C2DVector vecthis = new C2DVector(x - Line.point.x, y - Line.point.y);
double dProj = vecthis.Dot(Line.vector);
if (dProj < 0)
{
bAbove = false;
return false;
}
double dLength = Line.vector.GetLength();
dProj /= dLength;
if (dProj > dLength)
{
bAbove = true;
return false;
}
double dFactor = dProj / dLength;
C2DVector vProj = new C2DVector(Line.vector);
vProj.Multiply(dFactor);
ptOnLine.Set(Line.point.x + vProj.i, Line.point.y + vProj.j);
return true;
}
示例5: Distance
/// <summary>
/// Distance of the poly from the shape.
/// </summary>
/// <param name="Other">The other polygon test.</param>
/// <param name="ptOnThis">Output. The closest point on this.</param>
/// <param name="ptOnOther">The closest point on the other.</param>
public double Distance(C2DPolyBase Other, C2DPoint ptOnThis, C2DPoint ptOnOther)
{
if (Lines.Count == 0)
return 0;
if (Other.Lines.Count == 0)
return 0;
if (Other.LineRects.Count != Other.Lines.Count)
return 0;
if (Lines.Count != LineRects.Count)
return 0;
// First we find the closest line rect to the other's bounding rectangle.
int usThisClosestLineGuess = 0;
C2DRect OtherBoundingRect = Other.BoundingRect;
double dClosestDist = LineRects[0].Distance(OtherBoundingRect);
for (int i = 1; i < LineRects.Count; i++)
{
double dDist = LineRects[i].Distance(OtherBoundingRect);
if (dDist < dClosestDist)
{
dClosestDist = dDist;
usThisClosestLineGuess = i;
}
}
// Now cycle through all the other poly's line rects to find the closest to the
// guessed at closest line on this.
int usOtherClosestLineGuess = 0;
dClosestDist = Other.LineRects[0].Distance(LineRects[usThisClosestLineGuess]);
for (int j = 1; j < Other.LineRects.Count; j++)
{
double dDist = Other.LineRects[j].Distance(LineRects[usThisClosestLineGuess]);
if (dDist < dClosestDist)
{
dClosestDist = dDist;
usOtherClosestLineGuess = j;
}
}
// Now we have a guess at the 2 closest lines.
double dMinDistGuess = Lines[usThisClosestLineGuess].Distance(
Other.Lines[usOtherClosestLineGuess],
ptOnThis,
ptOnOther);
// If its 0 then return 0.
if (dMinDistGuess == 0)
return 0;
C2DPoint ptOnThisTemp = new C2DPoint();
C2DPoint ptOnOtherTemp = new C2DPoint();
// Now go through all of our line rects and only check further if they are closer
// to the other's bounding rect than the min guess.
for (int i = 0; i < Lines.Count; i++)
{
if (LineRects[i].Distance( OtherBoundingRect ) < dMinDistGuess)
{
for ( int j = 0 ; j < Other.Lines.Count ; j++)
{
double dDist = Lines[i].Distance(Other.Lines[j],
ptOnThisTemp,
ptOnOtherTemp);
if (dDist < dMinDistGuess)
{
ptOnThis.Set(ptOnThisTemp);
ptOnOther.Set(ptOnOtherTemp);
if (dDist == 0)
return 0;
dMinDistGuess = dDist;
}
}
}
}
// if we are here, there is no intersection but the other could be inside this or vice-versa
if ( BoundingRect.Contains(Other.BoundingRect)
&& Contains(ptOnOtherTemp) )
{
dMinDistGuess *= -1.0;
}
else if ( Other.BoundingRect.Contains(BoundingRect)
&& Other.Contains( ptOnThisTemp ))
{
dMinDistGuess *= -1.0;
}
return dMinDistGuess;
}
示例6: Distance
/// <summary>
/// Distance from the polygon provided.
/// </summary>
/// <param name="Poly">Polygon to find the distance to.</param>
/// <param name="ptOnThis">Closest point on this to recieve the result.</param>
/// <param name="ptOnOther">Closest point on the other to recieve the result.</param>
public double Distance(C2DPolyBase Poly, C2DPoint ptOnThis, C2DPoint ptOnOther)
{
C2DPoint ptOnThisResult = new C2DPoint();
C2DPoint ptOnOtherResult = new C2DPoint();
double dResult = _Rim.Distance(Poly, ptOnThis, ptOnOther);
if (dResult == 0)
return 0;
ptOnThisResult.Set(ptOnThis);
ptOnOtherResult.Set(ptOnOther);
bool bInside = dResult < 0;
dResult = Math.Abs(dResult);
for (int i = 0; i < _Holes.Count; i++)
{
double dDist = _Holes[i].Distance(Poly, ptOnThis, ptOnOther);
if (dDist == 0)
return 0;
if (dDist < 0)
bInside = false;
if (Math.Abs(dDist) < dResult)
{
ptOnThisResult.Set(ptOnThis);
ptOnOtherResult.Set(ptOnOther);
dResult = Math.Abs(dDist);
}
}
ptOnThis.Set(ptOnThisResult);
ptOnOther.Set(ptOnOtherResult);
if (bInside)
return dResult;
else
return - dResult;
}
示例7: Distance
/// <summary>
/// Distance to a line, returns the closest point on the circle and the line.
/// </summary>
/// <param name="Line">Line to calculate the distance to.</param>
/// <param name="ptOnThis">Closest point on the circle to recieve the result.</param>
/// <param name="ptOnOther">Closest point on the line to recieve the result.</param>
public double Distance(C2DLine Line, C2DPoint ptOnThis, C2DPoint ptOnOther)
{
CInterval ProjInt = new CInterval();
Project(Line, ProjInt);
if (ProjInt.dMax < 0)
{
// This means that the circle projects entirely "below" the line so the nearest point
// To this is the first point on the line and there are no interections.
ptOnOther.Set(Line.point);
return Distance(Line.point, ptOnThis);
}
double dLength = Line.GetLength();
if (ProjInt.dMin > dLength)
{
// This means that the circle projects entirely "above" the line so the nearest point
// To this is the second point on the line and there are no interections.
C2DPoint ptClosest = new C2DPoint(Line.GetPointTo());
ptOnOther.Set( ptClosest );
return Distance(ptClosest, ptOnThis);
}
// Now find out if there's an intersection.
List<C2DPoint> IntPts = new List<C2DPoint>();
if (Crosses(Line, IntPts))
{
ptOnThis.Set( IntPts[0]);
ptOnOther.Set( IntPts[0]);
return 0;
}
// Now find out if the line is entirely inside
if (ProjInt.dMin > 0 && ProjInt.dMax < dLength && this.Contains(Line.point))
{
double d1 = Distance(Line.point, ptOnThis);
C2DPoint ptThisTemp = new C2DPoint();
double d2 = Distance(Line.GetPointTo(), ptThisTemp);
Debug.Assert(d1 < 0 && d2 < 0);
if (d2 > d1) // NOTE USE OF > AS d2 and d1 are -ve.
{
ptOnThis.Set(ptThisTemp);
ptOnOther.Set(Line.GetPointTo());
return d2;
}
else
{
ptOnOther.Set(Line.point);
return d1;
}
}
// We now know the line is entirely outside.
// Now find out if this is closest to a point on the line.
double dCenOnLine = (ProjInt.dMax + ProjInt.dMin) / 2.0;
if (dCenOnLine > 0)
{
if (dCenOnLine < dLength)
{
// The centre is projected on the line
double dFactor = dCenOnLine / dLength;
C2DVector vProj = new C2DVector(Line.vector);
vProj.Multiply( dFactor);
C2DPoint ptOnLine = new C2DPoint( Line.point.GetPointTo(vProj));
ptOnOther.Set( ptOnLine );
return Distance(ptOnLine, ptOnThis);
}
else
{
// The centre is projected above the line.
C2DPoint ptClosest = new C2DPoint (Line.GetPointTo());
ptOnOther.Set(ptClosest);
return Distance(ptClosest, ptOnThis);
}
}
else
{
// This means that the circle projects entirely "below" the line.
ptOnOther.Set( Line.point);
return Distance(Line.point, ptOnThis);
}
}
示例8: Crosses
/// <summary>
/// True if this crosses the line and returns the intersectin points.
/// </summary>
/// <param name="Line">The line.</param>
/// <param name="IntersectionPts">The point set to recieve the result.</param>
public bool Crosses(C2DLine Line, List<C2DPoint> IntersectionPts)
{
double x1 = Line.point.x;
double x2 = Line.point.x + Line.vector.i;
double x3 = _Centre.x;
double y1 = Line.point.y;
double y2 = Line.point.y + Line.vector.j;
double y3 = _Centre.y;
double r = Radius;
double a = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
double b = 2 * ((x2 - x1) * (x1 - x3) + (y2 - y1) * (y1 - y3));
double c = x3 * x3 + y3 * y3 + x1 * x1 + y1 * y1 - 2 * (x3 * x1 + y3 * y1) - r * r;
double u = -b / (2 * a);
C2DPoint ptClosestToCen = new C2DPoint();
if (u < 0)
{
ptClosestToCen.Set( Line.point );
}
else if (u > 1)
{
ptClosestToCen.Set( Line.GetPointTo());
}
else
{
C2DVector V1 = new C2DVector(Line.vector);
V1.Multiply(u);
ptClosestToCen = Line.point.GetPointTo(V1);
}
double dDist = ptClosestToCen.Distance(_Centre);
if (dDist > Radius)
{
return false;
}
else
{
// Calculate the points.
double d1 = b * b - 4 * a * c;
Debug.Assert(d1 >= 0);
if (d1 < 0)
return false;
else if (d1 == 0)
{
double p1 = -b / (2 * a);
IntersectionPts.Add(Line.GetPointOn(p1));
return true;
}
else
{
d1 = Math.Sqrt(d1);
double p1 = (-b + d1) / (2 * a);
double p2 = (-b - d1) / (2 * a);
bool bResult = false;
if (p2 >= 0 && p2 <= 1)
{
bResult = true;
IntersectionPts.Add(Line.GetPointOn(p2));
}
if (p1 >= 0 && p1 <= 1)
{
bResult = true;
IntersectionPts.Add(Line.GetPointOn(p1));
}
return bResult;
}
}
}
示例9: Distance
/// <summary>
/// Distance between this and another straight line.
/// </summary>
/// <param name="TestLine">The test line.</param>
/// <param name="ptOnThis">The closest point on this to the other as a returned value.</param>
/// <param name="ptOnOther">The closest point on the other to this as a returned value.</param>
public double Distance(C2DLine TestLine, C2DPoint ptOnThis, C2DPoint ptOnOther)
{
C2DCircle Circle = new C2DCircle( GetCircleCentre(), Radius);
double dCircDist = Circle.Distance(TestLine, ptOnThis, ptOnOther);
double dDist = 0;
if (TestLine.IsOnRight(ptOnThis) ^ ArcOnRight)
{
// The point found isn't on this.
// This means the 2 closest points cannot be ON both lines, we must have a end point as one.
ptOnThis.Set(Line.point);
dDist = TestLine.Distance(ptOnThis, ptOnOther);
C2DPoint ptThisTemp = new C2DPoint(Line.GetPointTo());
C2DPoint ptOtherTemp = new C2DPoint();
double d2 = TestLine.Distance(ptThisTemp, ptOtherTemp);
if (d2 < dDist)
{
dDist = d2;
ptOnThis.Set(ptThisTemp);
ptOnOther.Set(ptOtherTemp);
}
// If the line was outside the circle then stop here as no need to go any further.
// This is because the closest point on this must be one of the end points.
if (dCircDist < 0)
{
double d3 = Distance(TestLine.point, ptThisTemp);
if (d3 < dDist)
{
dDist = d3;
ptOnThis.Set(ptThisTemp);
ptOnOther.Set(Line.point);
}
double d4 = Distance(TestLine.GetPointTo(), ptThisTemp);
if (d4 < dDist)
{
dDist = d4;
ptOnThis.Set(ptThisTemp);
ptOnOther.Set(Line.GetPointTo());
}
}
}
else
{
dDist = Math.Abs(dCircDist);
}
// ptOnThis.Set(ptThis);
// ptOnOther.Set(ptOther);
return dDist;
}