已知2点,求中间点序列的算法,解决即结贴

New_bug 2003-06-23 06:30:25
已知2点A(x1,y1),B(x2,y2),x1,y1,x2,y2都是正整数
求在线段AB之间的点序列S
点序列满足要求:
1、设点序列的起点S1,终点Sn:S1,S2,...,Sn ,n=|x2+y2-x1-y1|-1;
2、Si 是 Si-1 和 Si+1的相邻点 1=<i<=n
当n=0时 点序列不存在
当n>0时 点序列存在,S0 即 A点,Sn+1 即 B点
相邻点满足关系 |Si+1(x)+ Si+1(y) - Si(x)- Si(y)| = 1
因此任何一个点都存在2个相邻点
3、点序列中的点都是最接近直线AB的点
求算法

举例:
A(0,0),B(2,2)
的一个点序列解:(0,1),(1,1),(1,2)
...全文
52 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
New_bug 2003-06-30
  • 打赏
  • 举报
回复
方法二:利用面积最小,最接近直线原则
struct dot* GetPtListFromAtoB(struct dot A, struct dot B, int *nDots)
{
int nxMax = B.x - A.x;
int nyMax = B.y - A.y;
*nDots = abs(nxMax) + abs(nyMax) - 1;
if(*nDots <= 0)
return NULL;
int nNum = *nDots;
struct dot * pRtn = new struct dot[nNum];

int nSpX=1 , nSpY=1;
if (nxMax < 0) nSpX = -1;
if (nxMax == 0) nSpX = 0;
if (nyMax < 0) nSpY = -1;
if (nyMax == 0) nSpY = 0;

struct dot C1;
struct dot C2;
for (int i=0; i<nNum; i++)
{
if (i == 0)
{
C1.x = A.x;
C1.y = A.y + nSpY;
C2.x = A.x + nSpX;
C2.y = A.y;
if (GetAreaOfTriangle(A, B, C1)>GetAreaOfTriangle(A, B, C2))
{
pRtn[0].x = C2.x;
pRtn[0].y = C2.y;
}
else
{
pRtn[0].x = C1.x;
pRtn[0].y = C1.y;
}
}
else
{
C1.x = pRtn[i-1].x;
C1.y = pRtn[i-1].y + nSpY;
C2.x = pRtn[i-1].x + nSpX;
C2.y = pRtn[i-1].y;
if (GetAreaOfTriangle(A, B, C1)>GetAreaOfTriangle(A, B, C2))
{
pRtn[0].x = C2.x;
pRtn[0].y = C2.y;
}
else
{
pRtn[0].x = C1.x;
pRtn[0].y = C1.y;
}
}
}
return pRtn;
}
New_bug 2003-06-30
  • 打赏
  • 举报
回复
结贴:
方法一:
struct dot
{
int x;
int y;
};

struct dot* GetPtListFromAtoB(struct dot A, struct dot B, int *nPtNum)
{
int nxMax = B.x - A.x;
int nyMax = B.y - A.y;
*nPtNum = abs(nxMax) + abs(nyMax) - 1;
if(*nPtNum <= 0)
return NULL;
int nNum = *nPtNum;
struct dot * pRtn = new struct dot[nNum];

int i=0,j=0,k=0;

if (nxMax == 0)
{
k = 0;
if (nyMax > 0)
{
for(j=1; j<nyMax; j++)
{
pRtn[k].x = A.x;
pRtn[k].y = A.y + j;
k++;
}
}
else
{
for(j=-1; j>nyMax; j--)
{
pRtn[k].x = A.x;
pRtn[k].y = A.y + j;
k++;
}
}
}
else
{
double dK = (double)(B.y-A.y)/(double)(B.x-A.x); //Slope
double *dy = new double[nNum];

double dStep = (double)nxMax / (double)(nNum+1);
int nSpX=1 , nSpY=1;
if (nxMax < 0) nSpX = -1;
//if (nxMax == 0) nSpX = 0;
if (nyMax < 0) nSpY = -1;
if (nyMax == 0) nSpY = 0;

for(i=0; i<nNum; i++)
{
dy[i] = (i+1) * dStep * dK + A.y;
pRtn[i].x = dRound(A.x + (i+1) * dStep);
pRtn[i].y = dRound(dy[i]);
//cout<<"["<<A.x + (i+1) * dStep<<","<<dy[i]<<"]"<<endl;
}

//rejudge
int ndx,ndy;
double ddy;
for (i=0; i<nNum; i++)
{
if (i == 0)
{
ndx = abs(pRtn[0].x-A.x);
ndy = abs(pRtn[0].y-A.y);
ddy = fabs(dy[0]-A.y);
if(ndx+ndy == 0)
{
if(ddy < 0.5)
pRtn[0].x += nSpX;
else
pRtn[0].y += nSpY;
}
else if (ndx+ndy > 1)
{
if(ddy < 0.5)
{
pRtn[i].x = A.x;
pRtn[i].y = A.y + nSpY;
}
else
{
pRtn[i].x = A.x + nSpX;
pRtn[i].y = A.y;
}
}
}
else
{
ndx = abs(pRtn[i].x-pRtn[i-1].x);
ndy = abs(pRtn[i].y-pRtn[i-1].y);
ddy = fabs(dy[i]-pRtn[i].y);
if(ndx+ndy == 0)
{
if(ddy < 0.5)
pRtn[i].x += nSpX;
else
pRtn[i].y += nSpY;
}
else if (ndx+ndy > 1)
{
if(ddy < 0.5)
{
pRtn[i].x = pRtn[i-1].x;
pRtn[i].y = pRtn[i-1].y + nSpY;
}
else
{
pRtn[i].x = pRtn[i-1].x + nSpX;
pRtn[i].y = pRtn[i-1].y;
}
}
}
}
delete []dy;
}
return pRtn;
}
New_bug 2003-06-26
  • 打赏
  • 举报
回复
已知2点A(x1,y1),B(x2,y2),x1,y1,x2,y2都是正整数
求在线段AB之间的点序列S
点序列满足要求:
1、设点序列的起点S1,终点Sn:S1,S2,...,Sn ,n=|x2+y2|+|x1-y1|-1; //条件变更
2、Si 是 Si-1 和 Si+1的相邻点 1=<i<=n
当n=0时 点序列不存在
当n>0时 点序列存在,S0 即 A点,Sn+1 即 B点
相邻点满足关系 |Si+1(x)+ Si+1(y) - Si(x)- Si(y)| = 1
因此任何一个点都存在2个相邻点
3、点序列中的点都是最接近直线AB的点
求算法
seehill 2003-06-25
  • 打赏
  • 举报
回复
循环不可以吗?
New_bug 2003-06-24
  • 打赏
  • 举报
回复
请大家指教
leinfalosofking 2003-06-24
  • 打赏
  • 举报
回复
我写的博深海姆算法,结构不是太好,能用!是速度和直线效果很好的一种经典算法!

StartPoint开始点
EndPoint结束点
CurPs中间结果点
Speed步长(你这置1)
Reserver保留

该函数用在WHILE循环中,循环条件是CurPs与终点的距离小于1!

m_BersenhaimFlag;
m_ChangeFlag;
是两个全局变量,初值赋零!

NextPosition(CPoint StartPoint,CPoint EndPoint,CPoint *CurPs,int Speed,DWORD Reserver=0)
{
int DX;
int DY;
int i;
DX=EndPoint.x-StartPoint.x;
DY=EndPoint.y-StartPoint.y;

if(DY*DX >0)//k>0
{
if(DY>0 && DX>0)
{
if(DY < DX)//0<=k<1
{
if(1==m_ChangeFlag)
{
m_BersenhaimFlag=-DX;
m_ChangeFlag=0;
}
for(i=1;i<=Speed;++i)
{
++(CurPs->x);
m_BersenhaimFlag=m_BersenhaimFlag+2*DY;
if(m_BersenhaimFlag >= 0)
{
++(CurPs->y);
m_BersenhaimFlag=m_BersenhaimFlag-2*DX;
}
}
}
else//k>=1
{
if(1==m_ChangeFlag)
{
m_BersenhaimFlag=-DY;
m_ChangeFlag=0;
}
for(i=1;i<=Speed;++i)
{
++(CurPs->y);
m_BersenhaimFlag=m_BersenhaimFlag+2*DX;

if(m_BersenhaimFlag >= 0)
{
++(CurPs->x);
m_BersenhaimFlag=m_BersenhaimFlag-2*DY;
}
}
}
}
else//DX,DY<=0
{
if(DY < DX)//k>1
{
if(1==m_ChangeFlag)
{
m_BersenhaimFlag=DY;
m_ChangeFlag=0;
}
for(i=1;i<=Speed;++i)
{
--(CurPs->y);
m_BersenhaimFlag=m_BersenhaimFlag-2*DX;

if(m_BersenhaimFlag >= 0)
{
--(CurPs->x);
m_BersenhaimFlag=m_BersenhaimFlag+2*DY;
}
}
}
else//0<=k<1
{
if(1==m_ChangeFlag)
{
m_BersenhaimFlag=DX;
m_ChangeFlag=0;
}
for(i=1;i<=Speed;++i)
{
--(CurPs->x);
m_BersenhaimFlag=m_BersenhaimFlag-2*DY;

if(m_BersenhaimFlag >= 0)
{
--(CurPs->y);
m_BersenhaimFlag=m_BersenhaimFlag+2*DX;
}
}
}
}
}
else//(DX*DY <0)//k<0
{
if(DX > 0 && DY*DX!=0)
{
if(DX > (-DY))//-1<k<0
{
if(1==m_ChangeFlag)
{
m_BersenhaimFlag=-DX;
m_ChangeFlag=0;
}
for(i=1;i<=Speed;++i)
{
++(CurPs->x);
m_BersenhaimFlag=m_BersenhaimFlag-2*DY;

if(m_BersenhaimFlag >= 0)
{
--(CurPs->y);
m_BersenhaimFlag=m_BersenhaimFlag-2*DX;
}
}
}
else//k<-1
{
if(1==m_ChangeFlag)
{
m_BersenhaimFlag=DY;
m_ChangeFlag=0;
}
for(i=1;i<=Speed;++i)
{
--(CurPs->y);
m_BersenhaimFlag=m_BersenhaimFlag+2*DX;

if(m_BersenhaimFlag >= 0)
{
++(CurPs->x);
m_BersenhaimFlag=m_BersenhaimFlag+2*DY;
}
}
}
}
else//DY>0
{
if(DY*DX!=0)
{
if(DY > (-DX))//k>-1
{
if(1==m_ChangeFlag)
{
m_BersenhaimFlag=-DY;
m_ChangeFlag=0;
}
for(i=1;i<=Speed;++i)
{
++(CurPs->y);
m_BersenhaimFlag=m_BersenhaimFlag-2*DX;

if(m_BersenhaimFlag >= 0)
{
--(CurPs->x);
m_BersenhaimFlag=m_BersenhaimFlag-2*DY;
}
}
}
else//-1<k<0
{
if(1==m_ChangeFlag)
{
m_BersenhaimFlag=DX;
m_ChangeFlag=0;
}
for(i=1;i<=Speed;++i)
{
--(CurPs->x);
m_BersenhaimFlag=m_BersenhaimFlag+2*DY;
if(m_BersenhaimFlag >= 0)
{
++(CurPs->y);
m_BersenhaimFlag=m_BersenhaimFlag+2*DX;
}
}
}
}
}
}
if(0==DX*DY)
{
if(0==DX)
{
if(DY>0)
{
if(1==m_ChangeFlag)
{
m_BersenhaimFlag=0;
m_ChangeFlag=0;
}
for(i=1;i<=Speed;++i)
{
++(CurPs->y);
}

}
else
{
if(1==m_ChangeFlag)
{
m_BersenhaimFlag=0;
m_ChangeFlag=0;
}
for(i=1;i<=Speed;++i)
{
--(CurPs->y);
}
}
}
else
{
if(DX>0)
{
if(1==m_ChangeFlag)
{
m_BersenhaimFlag=0;
m_ChangeFlag=0;
}
for(i=1;i<=Speed;++i)
{
++(CurPs->x);
}
}
else
{
if(1==m_ChangeFlag)
{
m_BersenhaimFlag=0;
m_ChangeFlag=0;
}
for(i=1;i<=Speed;++i)
{
--(CurPs->x);
}
}
}
}
}//*/
New_bug 2003-06-24
  • 打赏
  • 举报
回复
2贴合一:
http://expert.csdn.net/Expert/topic/1952/1952082.xml?temp=.9844171
wqs6 2003-06-23
  • 打赏
  • 举报
回复
1,可能具有二重解!
A(0,0),B(2,2)
的一个点序列解:(0,1),(1,1),(1,2)
A(0,0),B(2,2)
的一个点序列解:(1,0),(1,1),(1,2)
2,可以采用for循环
for(i= a.x;i<b.x;i++)
for(j= a.y+i;j<b.y;j++)
{
result[k].x = i;
result[k].y = j;
k++;
}
实现!


wygsh 2003-06-23
  • 打赏
  • 举报
回复
拟合or插值
leeajax 2003-06-23
  • 打赏
  • 举报
回复
取步长h=(b.x-a.x)/n
求出斜率k
然后依次求n1,n2....nn的坐标

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧