-

- 加为好友
- 发送私信
- 在线聊天
Cricketol
- 等级:

- 可用分等级:
- 总技术专家分:
- 总技术专家分排名:
|
| 发表于:2008-08-20 22:53:5821楼 得分:200 |
解决了,我旋转角度时候因为是有double转int,所以有点点误差,我画的那条测试线有时候不被覆盖,有丁点偏 螺旋线比较散是因为我使用公式r=e^t; 当t为2π的时候r就等于533,画完第一圈半径就很大了,LZ可以适当缩小 (傍晚有事,所以来晚了) - C/C++ code
void CDrawlnView::DrawPic(CDC *pDC, CPoint pt1, CPoint pt2)
{
double PI = 3.1415926;
double E = 2.718281828;
//求得初始半径R
double r = sqrt(double((pt1.x - pt2.x)*(pt1.x - pt2.x) + (pt1.y - pt2.y)*(pt1.y - pt2.y)));
//double r = 10;
//设置原点坐标
int Ox = pt2.x;
int Oy = pt2.y;
pDC->MoveTo(pt2); //测试用
pDC->LineTo(pt1); //测试用
//求初始角度
double theta = log((double)r)/log(E);
double angle = theta/PI*180;//弧度制转角度制
//求夹角
double start_x = r*cos(angle/180*PI);
double start_y = r*sin(angle/180*PI);
double l = sqrt((start_x - pt1.x + Ox)*(start_x - pt1.x + Ox) + (start_y - pt1.y + Oy)*(start_y - pt1.y + Oy));
int included_angle = asin(l/2/r)/PI*360;
//判断加还是减夹角,即旋转
double d1 = sqrt(pow(r*cos((angle - included_angle)/180*PI) - pt1.x + Ox,2) + pow(r*sin((angle - included_angle)/180*PI) - pt1.y + Oy,2));
double d2 = sqrt(pow(r*cos((angle + included_angle)/180*PI) - pt1.x + Ox,2) + pow(r*sin((angle + included_angle)/180*PI) - pt1.y + Oy,2));
if(d1 < d2)
angle -= included_angle;
else if(d1 > d2)
angle += included_angle;
//开始画对数螺线
pDC->MoveTo(pt2);
for(angle += 0.5;angle < 500;angle += 0.5)
{
r = pow(E,angle/180*PI);
int temp_x = (int)r*cos(angle/180*PI);
int temp_y = (int)r*sin(angle/180*PI);
pDC->LineTo(temp_x + Ox,temp_y + Oy);
pDC->MoveTo(temp_x + Ox,temp_y + Oy);
}
}
| | |
修改
删除
举报
引用
回复
| |