Silverlight数学引擎(9)——尺规作图之线上点
<div id="cnblogs_post_body">线上点,这个线可以是直线也可以是曲线,这里统称为线了,因为尺规作图无外乎这两种。按照我们前面对点的分析,线上点是半自由点:[*]它可以随着鼠标拖动
[*]始终位于所在的线上
这就出现一个问题:比如当线的长度或者圆的大小放生变化时,自由点的位置如何变化?我们前面给出的方案是,比例保持不变:
[*]对于直线是&ldquo;距离比例不变&rdquo;(严格说是向量CA:BA不变,因为点可能在线段延长线上)
[*]对于圆是&ldquo;角度比例不变&rdquo;(即圆上点C与参照直径PQ的起点P相对圆心的夹角不变)
如下图所示:
http://pic002.cnblogs.com/images/2012/470264/2012120111225042.jpg
上图中红色点即为鼠标拖动线上点C(黄色)时,鼠标的位置,因为我们不控制鼠标的移动,所以鼠标可以移动到线外,那么要确定C的Ratio,就需要计算了,从上图可以看出,C点其实就是Mouse在直线AB上的投影点(垂足),MouseC就是AB的垂线。对于圆来说C就是直线MouseO和圆的交点。
先来看看直线AB,假设其方程为y=ax+b,那么与它垂直的线的斜率一定是-1/a,(初中学过的啦),可以表示成y=-x/a +b2, 将鼠标的点代入可以求得b2,所以计算C的Ratio就变成了先求两条直线的交点,这一点我们上节刚刚介绍过,直接看看代码吧:
<div class="cnblogs_code"> //线外一点到线的投影(垂足) public static LogicalPoint GetProjectionPoint(LogicalPoint point, LogicalLine line) { if(line.a.IsZero()) return new LogicalPoint(point.X, line.P1.Y); //line:y=ax+b, 则其垂线line2的方程为:y=-x/a+b2,将point坐标代入得b2 var b2 = point.Y + point.X/line.a; var point2 = new LogicalPoint(point.X + 1, -(point.X + 1)/line.a + b2); var line2 = new LogicalLine(point, point2); //求line、line2的交点: return LineAndLine(line2, line); } //线外一点分线段的向量比 public static double GetProjectionRatio(LogicalPoint point, LogicalLine line) { var projectionPoint = GetProjectionPoint(point, line); var result = 0.0; if (!(line.P1.X - line.P2.X).IsZero()) { result = (projectionPoint.X - line.P1.X)/(line.P2.X - line.P1.X); } else if (!(line.P1.Y - line.P2.Y).IsZero()) { result = (projectionPoint.Y - line.P1.Y)/(line.P2.Y - line.P1.Y); } return result; }
页:
[1]