Chinaunix首页 | 论坛 | 博客
  • 博客访问: 831367
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

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 )

阅读(2890) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~