如何在VB的PictureBox 内按顺序连着画一组线段 已知每个线段的长度及与下一线段的角度

1.长度A0,角度B0
2.长度A1,角度B1
3.长度A2,角度B2
4.长度A3,角度B3
...........
是否应该根据长度与角度计算出下一个点的坐标,然后用Line画,如果这样做的话每个点坐标如何计算,如果不是这样做的话有更好的办法也请给出,谢谢!

光有长度和角度,还不法绘制线段!
相同长度,相同角度的是一组平行线!
需要知道第1条线段的起始点的坐标,呢就可以了。追问

第一条线的起点为(0,0)点,终点为第二条线的起点,每条线的长度都不同 与前一条线所成的角度也不一样 该如何实现

追答

那就没有问题了,我给个例子:
我不知道你的数据如何得到,假设是用赋值得到,例子里只有4个点的情况:
Private Sub Command1_Click()
Dim d(1 To 100, 1 To 2) As Single
Dim x1 As Single
Dim y1 As Single
Dim x2 As Single
Dim y2 As Single
Dim i As Integer

d(1, 1) = 2000 '第1条线的长度
d(1, 2) = 300 '第1条线的角度

d(2, 1) = 200 '第2条线的长度
d(2, 2) = 30 '第2条线的角度

d(3, 1) = 400 '第3条线的长度
d(3, 2) = 45 '第3条线的角度

d(4, 1) = 300 '第4条线的长度
d(4, 2) = 18 '第4条线的角度

x1 = 0
y1 = 0
For i = 1 To 4
x2 = x1 + Cos(d(i, 2) * 180 / 3.14) * d(i, 1)
y2 = y1 + Sin(d(i, 2) * 180 / 3.14) * d(i, 1)
Picture1.Line (x1, y1)-(x2, y2)
x1 = x2
y1 = y2
Next i

End Sub
因为,VB的坐标原点在左上角,所以第1条线段的数据很重要,否则会看不到的,最好把坐标重新设一下。

追问

d(i, 2)这个角度并不是它与坐标系所成的角度,而是与前一条线段所成的角度,所以
x2 = x1 + Cos(d(i, 2) * 180 / 3.14) * d(i, 1)
y2 = y1 + Sin(d(i, 2) * 180 / 3.14) * d(i, 1)

这样应该是不对的,d(i, 2) * 180 / 3.14这个并不是与坐标所成的弧度,已知它的长度后,它在X,Y轴上的偏置的计算不应该是这个角的余弦和正弦值,应该是它与坐标所成角的余弦和正弦值.

追答

我是假设d(i, 2)中存放的该线段与坐标X轴正向所构成的角度值,你现在是与前一线段所夹的角度,这个你可以自己修改一下,不就可以了吗?
其实,思路已经很明确了。
按照你的要求,每一次角度是前一角度与d(i, 2)的和。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-11-08
根据倾斜角求出此角的正弦,余弦值
用长度除以正弦得纵坐标,用长度除以余弦得横坐标,
终点坐标确定

终点坐标确定后可以采取相对画线就可了。追问

希望能详细得写一下
第一个坐标是好求,但第二个,第三个,第N个坐标怎么求,
VB的Picture 怎么相对画线 我只知道用两点可以画一条线 而且必须知道两个点的坐标,怎么根据前面的的线 相对画线呢

本回答被网友采纳
第2个回答  2012-11-08
参考
Private Sub Command2_Click()
Line (500, 500)-(1500, 500) '画线
Line -Step(0, 1000) '相对画线
Line Step(0, 1000)-Step(200, 200)'相对画线
End Sub追问

这样相对画线其实还是一样的 还是得知道两个点的坐标,只不过可以省略写前次画过的终点坐标而已, 关键是这个坐标怎么计算出来 有没有什么好的办法

如何在VB的PictureBox 内按顺序连着画一组线段 已知每个线段的长度及与...
相同长度,相同角度的是一组平行线!需要知道第1条线段的起始点的坐标,呢就可以了。

...画一组线段 已知每个线段的长度及与下一线段的角度
嗯 你说得没错 假设 两点间长度是 r 角度是 a 则两点的 x之差=r cos(a)y之差=r sin(a)不过要记得picturebox 默认的坐标是 屏幕向右是x正方向 向下是y的正方向 跟咱们一般用的不一样 你可以用 picturebox1.scale (x1,y1)-(x2,y2) 来自定义坐标系 期中 (x1,y1) 是你想...

vb picturebox控件中 如何平移某条直线?如不能,哪种方式能实现线段的自...
Private Sub Form_Load()HScroll1.Max = 100 Picture1.AutoRedraw = True '随机产生直线坐标 Randomize X1 = Int(Picture1.ScaleWidth * Rnd)Y1 = Int(Picture1.ScaleHeight * Rnd)X2 = Int(Picture1.ScaleWidth * Rnd)Y2 = Int(Picture1.ScaleHeight * Rnd)'画出直线 Picture1.Line (X1...

VB中,使用 line语句在picturebox中画线段,如何改变线条粗细?谢谢...
设置PictureBox的DrawWidth属性,再画就行了...Picture1.DrawWidth = 10 '这个自己设定粗细了 Picture1.Line (0, 0)-(1000, 1000)

VB的List1控件所有的使用方法
强制全部重绘一个窗体或控件。语法object.Refresh object 所在处代表一个对象表达式,其值是“应用于”列表中的一个对象。说明在下列情况下使用 Refresh 方法: 在另一个窗体被加载时显示一个窗体的全部。更新诸如 FileListBox 控件之类的文件系统列表框的内容。更新Data 控件的数据结构。 Refresh 方法不能用于 MDI 窗...

VB 请问高手,如何让 VB 运行的速度快?
如果代码中只有一个模块,VB就只会进行一次加载操作,这样代码的效率就得到了提高;反之如果代码中有多个模块,VB会进行多次加载操作,代码的效率会降低。 17. 使用对象数组 当设计用户界面时,对于同样类型的控件,程序员应该尽量使用对象数组。你可以做一个实验:在窗口上添加100个PictureBox,每个PictureBox都有不同的名称...

VB 各个窗口属性对应的中文术语
AutoRedraw 属性为 False 时,hDC 属性是窗体窗口或 PictureBox 容器的真正的 hDC 值。 程序运行中, 不论 AutoRedraw 设置为何值,hDC 属性都可以改变。▲Image 返回持久图形的句柄,该句柄由 Windows 运行环境提供。不受 AutoRedraw 属性设置值的影响 Picture2.Picture = Picture1.Image '拷贝显示在Picture2中的所...

相似回答
大家正在搜