首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 200分求一个绘制对数螺旋线的代码,在线等待,泻啦 [已结贴,结贴人:micr0soft]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • micr0soft
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-19 11:44:22 楼主
    void Draw(CPoint pt1, CPoint pt2)
    {
    ....
    }

    要求从以pt1到pt2半径开始画,一直到屏幕之外。
    不要告诉我查高数书已经说很简单等等之类的话,谢绝灌水,谢谢。
    200  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • greatws
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-19 12:01:121楼 得分:0
    什么叫螺旋线?给个公式
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • micr0soft
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-19 12:03:032楼 得分:0
    资料再这里
    http://www.bast.net.cn/kpfw/zpzs/zpml/72141.shtml

    另外函数我少了一个参数,更正一下。
    void Draw(CDC * pDC, CPoint pt1, CPoint pt2)
    {
    ....
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • micr0soft
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-19 17:17:423楼 得分:0
    K,没人会?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Mackz
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 4

      6

      7

    发表于:2008-08-19 19:19:064楼 得分:0
    要说简单也简单,按照公式计算坐标然后连线即可;不过螺旋线用极坐标表示,类似楼主的参数看不出来如何对应,最好说明一下。另外,用极坐标表示计算方便,然后转换为直角坐标就行了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cricketol
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 12:43:105楼 得分:0
    C/C++ code
    //r为半径,t为转过的角度(角度制) int r = 0; for(int t = 0;;t++) { Draw(pDC,r*cos(t),r*sin(t)); r++; }

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cricketol
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 12:54:586楼 得分:0
    补充:Draw(pDC,r*cos(t),r*sin(t));
    这里是画一个点,这个点坐标为( r*cos(t) , r*sin(t) )
    循环完后就出现螺旋线上离散的点
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • micr0soft
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 13:02:427楼 得分:0
    楼上大虾,哪draw函数内我怎么做?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • micr0soft
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 13:32:178楼 得分:0
    int r = 0;
    for(int t = 0;;t++)
    {
        Draw(pDC,r*cos(t),r*sin(t));
        r++;
    }

    按照这个画法,画出来的是普通螺旋线,而不是对数螺旋吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hhhh63
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 14:04:059楼 得分:0
    "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));
    }
    }

    改成画线会更好一些
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cricketol
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 14:06:2510楼 得分:0
    你改一下就行了,r就是半径,通用的
    C/C++ code
    int r = 0; for(int t = 0;;t++) { Draw(pDC,r*cos(t),r*sin(t)); r = power(e,t); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • micr0soft
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 14:26:1211楼 得分:0
    Cricketol
    我还是不太明白,Draw(pDC,r*cos(t),r*sin(t)); 函数内部我该怎么做,
    能给出一个较为完整的代码嘛?
    我很着急用哦
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cricketol
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 16:20:4412楼 得分:0
    C/C++ code
    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); } }

    测试成功
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • micr0soft
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 16:40:2413楼 得分:0
    to Cricketol:
    我这里测试怎么就只画了半个圆?

    CPoint pt1(400,400);
    CPoint pt2(410,410);
    DrawPic(pDC, pt1, pt2);

    并且,好像开始也不是按照对数螺旋的样子,是不是那里还有BUG哦?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yccwt
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 16:43:2414楼 得分:0
    MARK!学习!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cricketol
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 16:57:5215楼 得分:0
    我是在局部坐标画的,起始半径和两点的连线还是有夹角,你再按照这个夹角旋转一下就可以了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • micr0soft
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 17:03:1416楼 得分:0
    晕,这个我不会啊,你可否给出完整的哦?
    帮人就帮到底吧,解决问题后,我会再开贴送200分。
    谢谢啦。另外,对数螺旋线的样子是这样的。
    http://www.bast.net.cn/kpfw/zpzs/zpml/72141.shtml
    我始终感觉开始时你的函数画的线就明显偏离这个样子的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cricketol
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 17:04:3217楼 得分:0
    也就是说我建立的坐标系是和平时我们画的一样,螺旋线永远是从点(1,0)开始的,当半径为那两点间距离的时候开始作图,因此假设从半径为R的地方开始画,那画出的都是一样的,或者说半径相同图形就都是一样的,我使用的原点就是pt2,所以你只要旋转一下就可以了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cricketol
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 17:18:2018楼 得分:0
    我画的就是对数螺旋,看起来不像那个是因为半径的系数我设置为1了,所以它张开得很快,没那么密
    今晚再我贴完整代码,先吃饭
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • micr0soft
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 17:23:0519楼 得分:0
    那太谢谢你了,问题解决后我会送你400分的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Cricketol
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 22:54:0020楼 得分:0
    解决了,我旋转角度时候因为是有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); } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • 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); } }
    修改 删除 举报 引用 回复