遇到一个问题是:已知3个点的坐标,如何实现移动其中的一个点最终使这3个点最终构成一个等腰三角形?想知道具体的实现思路?可以通过编码实现的具体语言不限,下面是看到的一种方法(C#)返回的是最终可以满足要求的一个点newc,不过没有看明白,还希望知道的指点一下!谢谢……
private Point newc;
private int newcx, newcy;
//-----
public IsocelesTriangle(Point a, Point b, Point c){
float dx1, dy1, dx2, dy2, side1, side2;
float slope, intercept;
            int incr;
dx1 = b.X - a.X;
dy1 = b.Y - a.Y;
dx2 = c.X  - b.X;
dy2 = c.Y - b.Y;
        
side1 = calcSide(dx1, dy1);
side2 = calcSide(dx2, dy2);
        
if (side2 < side1) 
incr = -1;
else
incr = 1;
slope = dy2 / dx2;
intercept = c.Y - slope * c.X;
        
//move point c so that this is an isoceles triangle
newcx = c.X;
newcy = c.Y;
while (Math.Abs (side1 - side2) > 1) {
newcx = newcx + incr;    //iterate a pixel at a time until close
newcy = (int)(slope * newcx + intercept);
dx2 = newcx - b.X;
dy2 = newcy - b.Y;
side2 = calcSide(dx2, dy2);
}
newc = new Point(newcx, newcy);
}private float calcSide(float a, float b) {
return (float)Math.Sqrt (a*a +  b*b);
}

解决方案 »

  1.   


    这个问题很无聊,根本没有什么技术含量。无非是这样的:假设有三个点:A、B、C对两个点A、B构成的“底边”,算出A、B两点构成的底边的中轴线,假设有一点C',点C'只要位于这条中轴线上且不在A、B构成的边上,那么点A、点B、点C'就构成了一个等腰三角形。这里对点C'的位置有两个要求:
    1) 点C'位于底边的中轴线上;
    2) 点C'不在底边上。如果点C恰好满足上述条件1)和条件2),则点C不需要做任何移动即可与A、B构成等要三角形。
    如果点C不满足上述条件,那么我们计算出符合条件的点C',然后把点C移动到点C'的位置上就可以了。我为什么说这个题目很无聊呢?因为:
    1) 等腰三角形的形成条件太宽松了,毫无压力;
    2) 这道题也没有指明说要寻找一个最经济的移动方法什么的,那么如果仅仅从实现这个题目的角度来讲,随随便便得到一个点C'就可以了。难度也太小了,没有什么研究的价值。
      

  2.   

    你太傲了 !人很多的时候是被简单的问题困住的&……