其实方法很简单,现实的问题由数学解决,不就是线段吗,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参数中传递需要判断的坐标,下面怎么办就不用说了吧。 请给分。
判断点在线上的函数,直接用吧 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;
{
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));
}}
参照这个修改一下就行了。
或者
(x*13)==(10*y) 更好些
到这里来看看
干脆这样好,定义一个数组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 即可
在判断某个点K(x,y)是否在线段AB上的时候把线段AB的颜色变为背景上没有的颜色,
然后获取K(x,y)点的颜色C,并与线段AB的颜色比较,如果颜色相同就表示在线上,
否则就不在线上,然后再把线段恢复为 以前的颜色!
(x*13)==(10*y) 是正确的,你用斜率算一下,就是这个结果。
至于你说的,点(1,1),(9,12)是不在这一条直线上的。//可以用数学方法来解,即使是有小数,数学方法也是成立的。
(0,0),(9,12) k=4/3;
(0,0),(10,13) k=13/10
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参数中传递需要判断的坐标,下面怎么办就不用说了吧。
请给分。
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;
}
考虑到10 13 互知 .那么只有 (-10 ,-13) (20 ,26) ,(30 29)....这些点,应该和easy了
2.这个问题我也遇到过,有一个控件叫DxFlowChart,有源码,里边有方法,可是看起来太累,我没有时间去研究
3.于是我采用了一种比较笨的方法,就是枚举线上所有的点,一个一个判断
4.还有一种思路,使用CreatePolygonRgn(...PtInRegion)的方法,我没有测试过
{
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,不过我是一星期上一次,呵呵