void Draw(CPoint pt1, CPoint pt2)
{
....
}要求从以pt1到pt2半径开始画,一直到屏幕之外。
不要告诉我查高数书已经说很简单等等之类的话,谢绝灌水,谢谢。

解决方案 »

  1.   

    资料再这里
    http://www.bast.net.cn/kpfw/zpzs/zpml/72141.shtml另外函数我少了一个参数,更正一下。
    void Draw(CDC * pDC, CPoint pt1, CPoint pt2) 

    .... 
      

  2.   


    //r为半径,t为转过的角度(角度制)
    int r = 0;
    for(int t = 0;;t++)
    {
        Draw(pDC,r*cos(t),r*sin(t));
        r++;
    }
      

  3.   

    补充:Draw(pDC,r*cos(t),r*sin(t));
    这里是画一个点,这个点坐标为( r*cos(t) , r*sin(t) )
    循环完后就出现螺旋线上离散的点
      

  4.   

    楼上大虾,哪draw函数内我怎么做?
      

  5.   

    int r = 0;
    for(int t = 0;;t++)
    {
        Draw(pDC,r*cos(t),r*sin(t));
        r++;
    }按照这个画法,画出来的是普通螺旋线,而不是对数螺旋吧
      

  6.   

    "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)); 

    } 改成画线会更好一些
      

  7.   

    你改一下就行了,r就是半径,通用的int r = 0; 
    for(int t = 0;;t++) 

        Draw(pDC,r*cos(t),r*sin(t)); 
        r = power(e,t);
      

  8.   

    Cricketol 
    我还是不太明白,Draw(pDC,r*cos(t),r*sin(t)); 函数内部我该怎么做,
    能给出一个较为完整的代码嘛?
    我很着急用哦
      

  9.   


    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);
    }
    }测试成功
      

  10.   

    to Cricketol:
    我这里测试怎么就只画了半个圆?CPoint pt1(400,400);
    CPoint pt2(410,410);
    DrawPic(pDC, pt1, pt2);并且,好像开始也不是按照对数螺旋的样子,是不是那里还有BUG哦?
      

  11.   

    晕,这个我不会啊,你可否给出完整的哦?
    帮人就帮到底吧,解决问题后,我会再开贴送200分。
    谢谢啦。另外,对数螺旋线的样子是这样的。
    http://www.bast.net.cn/kpfw/zpzs/zpml/72141.shtml
    我始终感觉开始时你的函数画的线就明显偏离这个样子的。
      

  12.   

    也就是说我建立的坐标系是和平时我们画的一样,螺旋线永远是从点(1,0)开始的,当半径为那两点间距离的时候开始作图,因此假设从半径为R的地方开始画,那画出的都是一样的,或者说半径相同图形就都是一样的,我使用的原点就是pt2,所以你只要旋转一下就可以了
      

  13.   

    解决了,我旋转角度时候因为是有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);
    }
    }
      

  14.   

    解决了,我旋转角度时候因为是有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);
    }
    }
      

  15.   

    我的要求是能画出
    http://www.bast.net.cn/kpfw/zpzs/zpml/72141.shtml 
    这种螺旋的图形的,可是我发现你的代码无论怎么改pt1和pt2半径好像图形都无变化,另外始终只画了半个圆就超过屏幕之外,也不是螺旋的形态哦。
    能再改改吗?
      

  16.   

    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);
    }还有,记住这个就是对数螺旋,不要再说它不是了
      

  17.   

    补充:
    除了上面的还要改这里
    //求初始角度
    double theta = log((double)r)/log(E)*7; //上面的r = pow(E,angle/180*PI/7);除以几这里就要乘以几
    double angle = theta/PI*180;//弧度制转角度制
      

  18.   

    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))