先来看一下,ExpressTools 的 AlignSpace 功能的作用:
这个用代码实现也比较简单:
public static void AlignSpace(Viewport pVp, Point3d model_space_p1, Point3d model_space_p2, Point3d paper_space_p1, Point3d paper_space_p2)
{
double dScaleFactor = model_space_p2.Dist2d(model_space_p1) / paper_space_p1.Dist2d(paper_space_p2);
pVp.ViewHeight = pVp.Height * dScaleFactor;
double dExpectAngle = paper_space_p1.GetAngleToXAxis(paper_space_p2);
double dOriginAngle = model_space_p1.GetAngleToXAxis(model_space_p2);
while (dExpectAngle < dOriginAngle)
dExpectAngle += RadianTool.PI2;
double dTwistAngle = dExpectAngle - dOriginAngle;
double dReference = AngleTool.ToRadian(40);
pVp.ViewDirection = new Vector3d(0, 0, 1);
double dViewportCenterAngle = paper_space_p1.GetAngleToXAxis(pVp.CenterPoint);
double dViewTargetAngle = dViewportCenterAngle - dTwistAngle;
Point3d pViewTarget = model_space_p1.Polar(dViewTargetAngle, paper_space_p1.Dist2d(pVp.CenterPoint) * dScaleFactor);
pVp.ViewTarget = pViewTarget;
pVp.ViewCenter = new Point2d(0, 0);
pVp.TwistAngle = dTwistAngle;
}
public static double Dist2d(this Point3d pt, Point3d other)
{
return Math.Sqrt(Math.Pow(pt.X - other.X, 2) + Math.Pow(pt.Y - other.Y, 2));
}
public static double GetAngleToXAxis(this Point3d from, Point3d to)
{
Vector2d vectord = new Vector2d(to.X - from.X, to.Y - from.Y);
return vectord.Angle;
}
public static Point3d Polar(Point3d basePoint, double angle, double distance)
{
return new Point3d(
basePoint.X + distance * Math.Cos(angle),
basePoint.Y + distance * Math.Sin(angle),
basePoint.Z);
}
近期评论