2012年(158)
分类: C/C++
2012-11-26 16:10:04
上一篇文章《两直角坐标系内点坐标的转换》http://blog.vckbase.com/bruceteen/archive/2011/03/08/52588.html
使用的是纯数学公式,很容易理解,就是先求得
夹角 和
伸缩比例。
但在计算机中运算时,因为使用的是浮点数运算,所以精度有限。
(不想解释了,半瓶子水的看到这里一定会说“哦,这个我理解,浮点数是不精确的”,其实我说的和这毫不相干,下面的公式依然使用浮点运算)
这个公式是如何推导出来的,我就省略掉了,大部分想吃鸡蛋的人对鸡怎么下蛋不感兴趣。
完整代码如下:
struct Point
{
long double x, y;
Point( long double x_, long double y_ ) : x(x_), y(y_) {}
bool operator==( const
Point& pt ) const { return x==pt.x && y==pt.y; }
bool operator!=( const
Point& pt ) const { return x!=pt.x || y!=pt.y; }
};
//
在第一个坐标中有两点a1和b1,分别重合于第二个坐标中的两点a2和b2,则第一个坐标中的c1点重合于第二个坐标中的c2点
// c2 =
coordcvt( a1, b1, a2, b2, c1 )
Point coordcvt( const Point& a1, const
Point& b1, const Point& a2, const Point& b2, const
Point& c1 )
{
long double c2x = a2.x +
(a2.y-b2.y) *
((c1.x-a1.x)*(a1.y-b1.y)+(c1.y-a1.y)*(b1.x-a1.x))/((b1.x-a1.x)*(b1.x-a1.x)+(a1.y-b1.y)*(a1.y-b1.y))
+ (b2.x-a2.x) *
((c1.x-a1.x)*(b1.x-a1.x)+(a1.y-c1.y)*(a1.y-b1.y))/((b1.x-a1.x)*(b1.x-a1.x)+(a1.y-b1.y)*(a1.y-b1.y));
long double c2y = a2.y + (b2.x-a2.x) *
((c1.x-a1.x)*(a1.y-b1.y)+(c1.y-a1.y)*(b1.x-a1.x))/((b1.x-a1.x)*(b1.x-a1.x)+(a1.y-b1.y)*(a1.y-b1.y))
- (a2.y-b2.y) *
((c1.x-a1.x)*(b1.x-a1.x)+(a1.y-c1.y)*(a1.y-b1.y))/((b1.x-a1.x)*(b1.x-a1.x)+(a1.y-b1.y)*(a1.y-b1.y));
return Point(c2x,c2y);
}
将此文中的方法和上一篇中的方法做一个对比
用上一篇的方法:
CoordCvt a( Point(0,0), Point(0,10000),
Point(0,0), Point(1,10000) );
Point m1 = a.Covert( Point(10000,0) );
得到 (
9999.9999999999982, -1.0000000019612645 )
用这一篇的方法:
Point m2 = coordcvt(
Point(0,0), Point(0,10000), Point(0,0), Point(1,10000), Point(10000,0) );
得到
( 10000.000000000000, -1.0000000000000000 )