地月银光 发表于 2013-1-2 23:18:54

Silverlight数学引擎(9)——尺规作图之线上点

<div id="cnblogs_post_body">线上点,这个线可以是直线也可以是曲线,这里统称为线了,因为尺规作图无外乎这两种。按照我们前面对点的分析,线上点是半自由点:

[*]它可以随着鼠标拖动
[*]始终位于所在的线上
这就出现一个问题:比如当线的长度或者圆的大小放生变化时,自由点的位置如何变化?我们前面给出的方案是,比例保持不变:

[*]对于直线是“距离比例不变”(严格说是向量CA:BA不变,因为点可能在线段延长线上)
[*]对于圆是“角度比例不变”(即圆上点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]
查看完整版本: Silverlight数学引擎(9)——尺规作图之线上点