200分求一个绘制对数螺旋线的代码,在线等待,泻啦 void Draw(CPoint pt1, CPoint pt2){....}要求从以pt1到pt2半径开始画,一直到屏幕之外。不要告诉我查高数书已经说很简单等等之类的话,谢绝灌水,谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 资料再这里http://www.bast.net.cn/kpfw/zpzs/zpml/72141.shtml另外函数我少了一个参数,更正一下。void Draw(CDC * pDC, CPoint pt1, CPoint pt2) { .... } //r为半径,t为转过的角度(角度制)int r = 0;for(int t = 0;;t++){ Draw(pDC,r*cos(t),r*sin(t)); r++;} 补充:Draw(pDC,r*cos(t),r*sin(t));这里是画一个点,这个点坐标为( r*cos(t) , r*sin(t) )循环完后就出现螺旋线上离散的点 楼上大虾,哪draw函数内我怎么做? int r = 0;for(int t = 0;;t++){ Draw(pDC,r*cos(t),r*sin(t)); r++;}按照这个画法,画出来的是普通螺旋线,而不是对数螺旋吧 "200 分求一段过3点做抛物线的代码,急啊"接分以下是C++代码,测试通过。 void CChildView::OnPaint() { CPaintDC dc(this); // 用于绘制的设备上下文 int x1 = 100; int y1 = 100; int x2 = 200; int y2 = 200; int x3 = 300; int y3 = 150; double a = (double)(y1*x2 + y2*x3 + y3*x1 - y3*x2 - y2*x1 - y1*x3) / (x1*x1*x2 + x2*x2*x3 + x3*x3*x1 - x3*x3*x2 - x2*x2*x1 - x1*x1*x3); double b = -(double)(y1*x2*x2 + y2*x3*x3 + y3*x1*x1 - y3*x2*x2 - y2*x1*x1 - y1*x3*x3) / (x1*x1*x2 + x2*x2*x3 + x3*x3*x1 - x3*x3*x2 - x2*x2*x1 - x1*x1*x3) ; double c = (double)(y1*x2*x2*x3 + y2*x3*x3*x1 + y3*x1*x1*x2 - y3*x2*x2*x1 - y2*x1*x1*x3 - y1*x3*x3*x2) / (x1*x1*x2 + x2*x2*x3 + x3*x3*x1 - x3*x3*x2 - x2*x2*x1 - x1*x1*x3) ; for(int x=100;x <1024;x+=1) { double y = a*x*x + b*x + c; dc.SetPixel(x,y,RGB(0,0,0)); } } 改成画线会更好一些 你改一下就行了,r就是半径,通用的int r = 0; for(int t = 0;;t++) { Draw(pDC,r*cos(t),r*sin(t)); r = power(e,t);} Cricketol 我还是不太明白,Draw(pDC,r*cos(t),r*sin(t)); 函数内部我该怎么做,能给出一个较为完整的代码嘛?我很着急用哦 void CDrawlnView::DrawPic(CDC *pDC, CPoint pt1, CPoint pt2){ double PI = 3.1415926; double E = 2.718281828; //求得初始半径R int r = (int)sqrt(double((pt1.x - pt2.x)*(pt1.x - pt2.x) + (pt1.y - pt2.y)*(pt1.y - pt2.y))); //设置原点坐标 int Ox = pt2.x; int Oy = pt2.y; pDC->MoveTo(pt2); //求初始角度 double theta = log((double)r)/log(E); double angle = theta/PI*180;//弧度制转角度制 //开始画对数螺线 pDC->MoveTo(pt2); for(angle += 0.05;angle < 360;angle += 0.05) { 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); }}测试成功 to Cricketol:我这里测试怎么就只画了半个圆?CPoint pt1(400,400); CPoint pt2(410,410); DrawPic(pDC, pt1, pt2);并且,好像开始也不是按照对数螺旋的样子,是不是那里还有BUG哦? 晕,这个我不会啊,你可否给出完整的哦?帮人就帮到底吧,解决问题后,我会再开贴送200分。谢谢啦。另外,对数螺旋线的样子是这样的。http://www.bast.net.cn/kpfw/zpzs/zpml/72141.shtml我始终感觉开始时你的函数画的线就明显偏离这个样子的。 也就是说我建立的坐标系是和平时我们画的一样,螺旋线永远是从点(1,0)开始的,当半径为那两点间距离的时候开始作图,因此假设从半径为R的地方开始画,那画出的都是一样的,或者说半径相同图形就都是一样的,我使用的原点就是pt2,所以你只要旋转一下就可以了 解决了,我旋转角度时候因为是有double转int,所以有点点误差,我画的那条测试线有时候不被覆盖,有丁点偏螺旋线比较散是因为我使用公式r=e^t;当t为2π的时候r就等于533,画完第一圈半径就很大了,LZ可以适当缩小(傍晚有事,所以来晚了)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); }} 解决了,我旋转角度时候因为是有double转int,所以有点点误差,我画的那条测试线有时候不被覆盖,有丁点偏螺旋线比较散是因为我使用公式r=e^t;当t为2π的时候r就等于533,画完第一圈半径就很大了,LZ可以适当缩小(傍晚有事,所以来晚了)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); }} 我的要求是能画出http://www.bast.net.cn/kpfw/zpzs/zpml/72141.shtml 这种螺旋的图形的,可是我发现你的代码无论怎么改pt1和pt2半径好像图形都无变化,另外始终只画了半个圆就超过屏幕之外,也不是螺旋的形态哦。能再改改吗? LZ,我再次纠正你的观点,我画的是的确是对数螺旋,是螺旋形态的,只不过半径增长太快看这句话:"螺旋线比较散是因为我使用公式r=e^t; "LZ可以自己算一下t到2派了r有多大,可以按照下面改 for(angle += 0.5;angle < 5300;angle += 0.5)//循环到5300度,可以根据需要自己改 { r = pow(E,angle/180*PI/7); //这里使用公式r=e^(t/7);可以根据需要自己改 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); }还有,记住这个就是对数螺旋,不要再说它不是了 补充:除了上面的还要改这里 //求初始角度 double theta = log((double)r)/log(E)*7; //上面的r = pow(E,angle/180*PI/7);除以几这里就要乘以几 double angle = theta/PI*180;//弧度制转角度制 xt=h*tan(q)*exp(sin(q)/tan(Bp)*rad(-Vb))*cos(Vb)yt=h*tan(q)*exp(sin(q)/tan(Bp)*rad(-Vb))*sin(Vb)zt=-h*exp(sin(q)/tan(Bp)*rad(-Vb)) 大家一定都想解决的问题,欢迎大家集思广益 请高手指教!!! 一个MFC的基础问题 问个简单问题:怎么在Picture控件里显示一个位图文件? 请教,如何在文档窗口内输出一个double型的数? vc写程序得时候没有了上下文帮助了 请教如何在程序退出时,关闭计算机! 拜托高手指点:如何制作WinXP风格的菜单、按扭……?!!! 异常类怎么样操作合适? 线程句柄赋值问题(一直提示左值) 如何获取windows线程信息 求 vc unicode 编码/GB18030编码 汉字拼音,先谢了
http://www.bast.net.cn/kpfw/zpzs/zpml/72141.shtml另外函数我少了一个参数,更正一下。
void Draw(CDC * pDC, CPoint pt1, CPoint pt2)
{
....
}
//r为半径,t为转过的角度(角度制)
int r = 0;
for(int t = 0;;t++)
{
Draw(pDC,r*cos(t),r*sin(t));
r++;
}
这里是画一个点,这个点坐标为( r*cos(t) , r*sin(t) )
循环完后就出现螺旋线上离散的点
for(int t = 0;;t++)
{
Draw(pDC,r*cos(t),r*sin(t));
r++;
}按照这个画法,画出来的是普通螺旋线,而不是对数螺旋吧
{
CPaintDC dc(this); // 用于绘制的设备上下文 int x1 = 100;
int y1 = 100;
int x2 = 200;
int y2 = 200;
int x3 = 300;
int y3 = 150; double a = (double)(y1*x2 + y2*x3 + y3*x1 - y3*x2 - y2*x1 - y1*x3) / (x1*x1*x2 + x2*x2*x3 + x3*x3*x1 - x3*x3*x2 - x2*x2*x1 - x1*x1*x3); double b = -(double)(y1*x2*x2 + y2*x3*x3 + y3*x1*x1 - y3*x2*x2 - y2*x1*x1 - y1*x3*x3) / (x1*x1*x2 + x2*x2*x3 + x3*x3*x1 - x3*x3*x2 - x2*x2*x1 - x1*x1*x3) ; double c = (double)(y1*x2*x2*x3 + y2*x3*x3*x1 + y3*x1*x1*x2 - y3*x2*x2*x1 - y2*x1*x1*x3 - y1*x3*x3*x2) / (x1*x1*x2 + x2*x2*x3 + x3*x3*x1 - x3*x3*x2 - x2*x2*x1 - x1*x1*x3) ; for(int x=100;x <1024;x+=1)
{
double y = a*x*x + b*x + c;
dc.SetPixel(x,y,RGB(0,0,0));
}
} 改成画线会更好一些
for(int t = 0;;t++)
{
Draw(pDC,r*cos(t),r*sin(t));
r = power(e,t);
}
我还是不太明白,Draw(pDC,r*cos(t),r*sin(t)); 函数内部我该怎么做,
能给出一个较为完整的代码嘛?
我很着急用哦
void CDrawlnView::DrawPic(CDC *pDC, CPoint pt1, CPoint pt2)
{
double PI = 3.1415926;
double E = 2.718281828;
//求得初始半径R
int r = (int)sqrt(double((pt1.x - pt2.x)*(pt1.x - pt2.x) + (pt1.y - pt2.y)*(pt1.y - pt2.y)));
//设置原点坐标
int Ox = pt2.x;
int Oy = pt2.y;
pDC->MoveTo(pt2); //求初始角度
double theta = log((double)r)/log(E);
double angle = theta/PI*180;//弧度制转角度制 //开始画对数螺线
pDC->MoveTo(pt2);
for(angle += 0.05;angle < 360;angle += 0.05)
{
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);
}
}测试成功
我这里测试怎么就只画了半个圆?CPoint pt1(400,400);
CPoint pt2(410,410);
DrawPic(pDC, pt1, pt2);并且,好像开始也不是按照对数螺旋的样子,是不是那里还有BUG哦?
帮人就帮到底吧,解决问题后,我会再开贴送200分。
谢谢啦。另外,对数螺旋线的样子是这样的。
http://www.bast.net.cn/kpfw/zpzs/zpml/72141.shtml
我始终感觉开始时你的函数画的线就明显偏离这个样子的。
螺旋线比较散是因为我使用公式r=e^t;
当t为2π的时候r就等于533,画完第一圈半径就很大了,LZ可以适当缩小
(傍晚有事,所以来晚了)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);
}
}
螺旋线比较散是因为我使用公式r=e^t;
当t为2π的时候r就等于533,画完第一圈半径就很大了,LZ可以适当缩小
(傍晚有事,所以来晚了)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);
}
}
http://www.bast.net.cn/kpfw/zpzs/zpml/72141.shtml
这种螺旋的图形的,可是我发现你的代码无论怎么改pt1和pt2半径好像图形都无变化,另外始终只画了半个圆就超过屏幕之外,也不是螺旋的形态哦。
能再改改吗?
看这句话:"螺旋线比较散是因为我使用公式r=e^t; "
LZ可以自己算一下t到2派了r有多大,可以按照下面改
for(angle += 0.5;angle < 5300;angle += 0.5)//循环到5300度,可以根据需要自己改
{
r = pow(E,angle/180*PI/7); //这里使用公式r=e^(t/7);可以根据需要自己改
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);
}还有,记住这个就是对数螺旋,不要再说它不是了
除了上面的还要改这里
//求初始角度
double theta = log((double)r)/log(E)*7; //上面的r = pow(E,angle/180*PI/7);除以几这里就要乘以几
double angle = theta/PI*180;//弧度制转角度制
yt=h*tan(q)*exp(sin(q)/tan(Bp)*rad(-Vb))*sin(Vb)
zt=-h*exp(sin(q)/tan(Bp)*rad(-Vb))