不要用数学的方法求解,国为坐标是没有小数的。

解决方案 »

  1.   

    void lineBres(int xa,int ya,int xb,int yb,HDC dc)
    {
        int dx=abs(xa-xb);
        int dy=abs(ya-yb);
        int p=2*dy-dx;
        int twody=2*dy;
        int twodydx = 2*(dy-dx);
        int x,y,xend;
        if(xa>xb)
        {
            x=xb; y=yb;
            xend=xa;    }
        else
        {
            x=xa;y=ya;
            xend=xb;
        }
        SetPixel(dc,(x),(y),RGB(255,0,0));
        while(x<xend)
        {
            x++;
            if(p<0)
                p+=twody;
            else
            {
                y++;
                p+=twodydx;
            }
            SetPixel(dc,(x),(y),RGB(255,0,0));
        }}
    参照这个修改一下就行了。
      

  2.   

    (x*1.0)/y==(10*1.0)/13
    或者
    (x*13)==(10*y) 更好些
      

  3.   

    www.solarstones.com/wzq
    到这里来看看
      

  4.   

    不用数学方法,直线又很短。
    干脆这样好,定义一个数组line表示直线,line[y]=x, (x,y)构成直线上的点坐标。BYTE  line[14]={ 0, 1, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10};在程序中,对于特点的点(x,y)只需先判断y是否大于等于0,小于等于13,
    然后判断  line[y] 是否等于x 即可
      

  5.   

    经典!高山流水,知音难觅!Nothing is imposible for a willing heart !
      

  6.   

    ********我提供一个简单的办法:
    在判断某个点K(x,y)是否在线段AB上的时候把线段AB的颜色变为背景上没有的颜色,
    然后获取K(x,y)点的颜色C,并与线段AB的颜色比较,如果颜色相同就表示在线上,
    否则就不在线上,然后再把线段恢复为 以前的颜色!
      

  7.   

    To: zqrjx(阿健) 
       (x*13)==(10*y) 是正确的,你用斜率算一下,就是这个结果。
    至于你说的,点(1,1),(9,12)是不在这一条直线上的。//可以用数学方法来解,即使是有小数,数学方法也是成立的。
      

  8.   

    (0,0),(1,1)的斜率k=1
    (0,0),(9,12)     k=4/3;
    (0,0),(10,13)    k=13/10
      

  9.   

    JennyVenus讲得很有道理,可以用他的方法试一下,应该行的
      

  10.   

    其实方法很简单,现实的问题由数学解决,不就是线段吗,GDI的问题由GDI解决,因为绘制直线的时候,使用的是整数坐标,所以必须知道两点之间的每个点是怎么算出来的,当然用不着自己算,请看:
    BOOL LineDDA(
      int nXStart,             // x-coordinate of starting point
      int nYStart,             // y-coordinate of starting point
      int nXEnd,               // x-coordinate of ending point
      int nYEnd,               // y-coordinate of ending point
      LINEDDAPROC lpLineFunc,  // callback function -> LineDDAProc
      LPARAM lpData            // application-defined data
    );
    自己在回调函数lpLineFunc中判断即可。
    VOID CALLBACK LineDDAProc(
      int X,          // x-coordinate of point
      int Y,          // y-coordinate of point
      LPARAM lpData   // application-defined data
    );
    此函数的参数就是GDI绘制直线时的每一个点坐标,可以在lpData参数中传递需要判断的坐标,下面怎么办就不用说了吧。
    请给分。
      

  11.   

    判断点在线上的函数,直接用吧
    BOOL  CLine::ptInEveryLine(CPoint point,CPoint sp,CPoint ep)
    {
    CRgn Rgnline;
    int xMin=min(sp.x,ep.x);
    int xMax=max(sp.x,ep.x);
    int yMin=min(sp.y,ep.y);
    int yMax=max(sp.y,ep.y); CRect rect(xMin-3,yMin-3,xMax+3,yMax+3); if(!Rgnline.CreateRectRgnIndirect(rect))
    return FALSE; CPoint testp=point;
    if(!Rgnline.PtInRegion(testp))
    return FALSE; CSize dp=point-sp;
    double ledge=sqrt((yMax-yMin)*(yMax-yMin)+(xMax-xMin)*(xMax-xMin));
    double disp=sqrt((point.x-sp.x)*(point.x-sp.x)+(point.y-sp.y)*(point.y-sp.y));
    double cosan=(ep.x-sp.x)/ledge;
    double sinan=(ep.y-sp.y)/ledge;
    double dist=fabs(dp.cx*(ep.x-sp.x)/ledge+dp.cy*(ep.y-sp.y)/ledge-disp);
    if (dist<=1)
    return TRUE;
    return FALSE;

    }
      

  12.   

    你要考虑坐标没有小数的情况, 那么 只有100%符合这个斜率情况下才在这条直线上.....
    考虑到10 13 互知 .那么只有 (-10 ,-13) (20 ,26) ,(30 29)....这些点,应该和easy了
      

  13.   

    1.用斜率的方法是不行的,因为画图的时候画的是一条闭合(暂时用这个词,意思是点与点之间的是无空隙的 例如哈1,1,到2,3那么中间的点斜率计算是又问题的),
    2.这个问题我也遇到过,有一个控件叫DxFlowChart,有源码,里边有方法,可是看起来太累,我没有时间去研究
    3.于是我采用了一种比较笨的方法,就是枚举线上所有的点,一个一个判断
    4.还有一种思路,使用CreatePolygonRgn(...PtInRegion)的方法,我没有测试过
      

  14.   

    看得我气,给你源代码吧!BOOL CBLine::PointInLine(int x, int y, int bx, int by, int ex, int ey)
    {
        BOOL yIn = y <= max(by, ey) + 2 && y >= min(by, ey) - 2 ;
        BOOL xIn = x <= max(bx, ex) + 2 && x >= min(bx, ex) - 2;
        if (by != ey)
        {
            double distance = x - bx - (y - by) * (ex - bx)/(ey - by);
            yIn &= abs(distance) <= 2;
        }
        else if (bx != ex)
        {
           double distance = y - by - (x - bx) * (ey - by)/(ex - bx);
           xIn &= abs(distance) <= 2;
        }
        return ( xIn && yIn);
    }有问题,.cn,不过我是一星期上一次,呵呵