高手帮忙!200分一个问题。 如何在一个已知矩形中画一系列的间距相等的平行线(平行线不能超过边界)(类似于填充)已知条件 : 只知道那些平行线中的一条,(该条线中的一点和其方向角已知)画出其它的平行于该线的平行线。平行线间的的间距已知。矩形四个顶点已知。最好有代码。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 设知道平行线中的一条L1,(该条线中的一点和其方向角已知)为:L1: 点X0(x0,y0),方向向量N0(n1,n2),L1直线方程为: (x,y)=(x0, y0) +(n1, n2)t;设矩形四直线方程为: R1:(x, y)=(c1,0); R2: (x, y)=(c2, 0) R3: (x, y)=(0, d1); R4: (x, y)=(0, d2)Step1: 求L1和四直线的交点(加上约束条件只有两解,例如设为U(u1, 0), V(u2, 0))Step2:设线的间隔是(p, 0) for(i=0;i<条数;i++) { Line(U+P, V+P); }很简单,看一些《空间解析集合的数就明白了》 谢谢你的帮助。不过,用你的方法只能将点在矩形上下两对边时连成平行线, for(i=0;i<条数;i++) { Line(U+P, V+P); }当点循环到上边和右边连线时就会超过右边的边框, 所以也就会超过边界了。点在左和下连线时也一样。还得麻烦你帮我想想解决了希望你能够告诉我谢谢。 画线的问题解决了,下面我来帮你解决一下边界的问题。在计算机图形学中,这类问题很典型,可以利用自定义编码实现。编码:四位码中的第一位代表某点在上边界的上(1)或下(0),第二位代表某点在下边界的上(1)或下(0),同理,第三位代表某点在左边界的左(1)或右(0),第四位代表某点在右边界的左(0)或右(1), 1000 ________________ | | | |0010 | 0000 | 0001 | | |______________| 0100代码://定义描述直线端点的结构体typedef sturct _END { int x; int y; char code;//记录点的编码 }END;//记录平行线的端点//定义描述直线端点的结构体typedef sturct _LINE{ END end1; END end2;}LINE;假设第i条线为Linei,矩形的四个边界点为POINT类型的Plt(左上),Plb(左下),Prt(右上),Prb(右下);Linei.end1.code=0;//0000Linei.end2.code=0;//0000//判断上边界if(Linei.end1.y>=Plt.y)//上边界的上方{ if(Linei.end1.x>=Prt.x)//右边界的右方 { Linei.end1.code=9;//1001 } if(Linei.end1.x<=Plt.x)//左边界的左方 { Linei.end1.code=10;//1010 }}//判断下边界if(Linei.end1.y<=Plb.y)//下边界的下方{ if(Linei.end1.x>=Prt.x)//右边界的右方 { Linei.end1.code=5;//0101 } if(Linei.end1.x<=Plt.x)//左边界的左方 { Linei.end1.code=6;//0110 }}//然后利用按位与操作(位操作快于数值比较)确定点的位置,比较简单,相关内容可查阅计算机图形学的相关书籍; 离开之后才知道,程序员的烙印从未从我身上离去 在一个阻塞线程中的CAsyncSocket对象能正常触发事件吗? 读文件问题 如何固定窗口的大小? 急 求图形消影的源代码 如何在CListCtrl首列中加入ICON? 如何设置对话框中标签页的标题名称????????????????????????(我只有10分了,谢谢!在线等) 急:请教LoadLibrary()的用法 vc中activex的问题。不是高手免进! 为什么加上ADO的控件后对话框不能显示 离开csdn了,感谢枪枪帮助!散分了! 请问免费下载MCSD试题的网址?
L1: 点X0(x0,y0),方向向量N0(n1,n2),L1直线方程为:
(x,y)=(x0, y0) +(n1, n2)t;
设矩形四直线方程为:
R1:(x, y)=(c1,0);
R2: (x, y)=(c2, 0)
R3: (x, y)=(0, d1);
R4: (x, y)=(0, d2)Step1: 求L1和四直线的交点(加上约束条件只有两解,例如设为U(u1, 0), V(u2, 0))
Step2:设线的间隔是(p, 0)
for(i=0;i<条数;i++)
{
Line(U+P, V+P);
}很简单,看一些《空间解析集合的数就明白了》
不过,用你的方法只能将点在矩形上下两对边时连成平行线,
for(i=0;i<条数;i++)
{
Line(U+P, V+P);
}
当点循环到上边和右边连线时就会超过右边的边框, 所以也就会超过边界了。
点在左和下连线时也一样。
还得麻烦你帮我想想解决了希望你能够告诉我谢谢。
在计算机图形学中,这类问题很典型,可以利用自定义编码实现。
编码:
四位码中的第一位代表某点在上边界的上(1)或下(0),第二位代表某点在下边界的上(1)或下(0),同理,第三位代表某点在左边界的左(1)或右(0),第四位代表某点在右边界的左(0)或右(1),
1000
________________
| |
| |
0010 | 0000 | 0001
| |
|______________|
0100
代码:
//定义描述直线端点的结构体
typedef sturct _END
{
int x;
int y;
char code;//记录点的编码
}END;//记录平行线的端点//定义描述直线端点的结构体
typedef sturct _LINE
{
END end1;
END end2;
}LINE;假设第i条线为Linei,矩形的四个边界点为POINT类型的Plt(左上),Plb(左下),Prt(右上),Prb(右下);
Linei.end1.code=0;//0000
Linei.end2.code=0;//0000
//判断上边界
if(Linei.end1.y>=Plt.y)//上边界的上方
{
if(Linei.end1.x>=Prt.x)//右边界的右方
{
Linei.end1.code=9;//1001
}
if(Linei.end1.x<=Plt.x)//左边界的左方
{
Linei.end1.code=10;//1010
}
}//判断下边界
if(Linei.end1.y<=Plb.y)//下边界的下方
{
if(Linei.end1.x>=Prt.x)//右边界的右方
{
Linei.end1.code=5;//0101
}
if(Linei.end1.x<=Plt.x)//左边界的左方
{
Linei.end1.code=6;//0110
}
}//然后利用按位与操作(位操作快于数值比较)确定点的位置,比较简单,相关内容可查阅计算机图形学的相关书籍;