const
pi
=
3.1415926
dim
angle
as
integer
private
sub
form_load()
'调整空间尺寸,位置及初始参数
me.scalemode
=
3
me.caption
=
"曲柄滑块机构的演示"
me.width
=
5000
me.height
=
3500
picture1.scalemode
=
3
picture1.autoredraw
=
true
picture1.move
0,
0,
me.scalewidth,
150
command1.caption
=
"开始(&b)"
command1.move
20,
160,
70,
30
label1.caption
=
"速度:"
label1.move
120,
170,
100,
30
hscroll1.min
=
1
hscroll1.max
=
20
hscroll1.move
160,
160,
140,
30
timer1.interval
=
20
timer1.enabled
=
false
end
sub
private
sub
command1_click()
timer1.enabled
=
not
timer1.enabled
if
timer1.enabled
then
command1.caption
=
"暂停(&s)"
else
command1.caption
=
"开始(&b)"
end
if
end
sub
sub
draw(byval
ox
as
integer,
byval
oy
as
integer,
byval
orad
as
integer)
'ox,oy圆链慧心坐标,orad半径
angle
=
(angle
+
hscroll1.value)
mod
360
xo
=
ox
+
orad
*
cos(angle
*
pi
/
180)
'圆周上的铰链点坐标租答(xo,yo)
yo
=
oy
+
orad
*
sin(angle
*
pi
/
180)
xs
=
sqr((4
*
orad)
^
2
-
10
^
2)
+
xo
'滑块的左边界x坐标,连杆长度取4*orad,滑块高度取20(像素)
picture1.backcolor
=
picture1.backcolor
picture1.drawstyle
=
0
'实线
picture1.drawwidth
=
2
'线宽2
picture1.line
(ox
+
2
*
orad,
oy)-(ox
+
6
*
orad,
oy)
'壁面
picture1.line
(ox,
oy)-(xo,
yo)
'连接圆心与圆周上的铰链点
picture1.line
(xs,
oy
-
10)-(xo,
yo),
vbblue
'连接滑块与圆周上的铰链点
picture1.fillstyle
=
1
'透明填充
picture1.circle
(ox,
oy),
orad
'画圆
picture1.fillstyle
=
0
'实体填充
picture1.fillcolor
=
vbwhite
'圆心
picture1.circle
(ox,
oy),
5
picture1.fillcolor
=
vbgreen
'圆周上的铰链点
picture1.circle
(xo,
yo),
4
picture1.fillcolor
=
vbred
'滑块
picture1.line
(xs,
oy
-
20)-(xs
+
30,
oy),
,
b
picture1.drawstyle
=
2
'虚线
picture1.drawwidth
=
1
'线宽1
for
i
=
0
to
9
'表示壁面的虚线
picture1.line
(i
*
4
*
orad
/
10
+
ox
+
2
*
orad,
oy)-(i
*
4
*
orad
/
10
+
ox
+
2
*
orad
+
20,
oy
+
20)
next
end
sub
private
sub
timer1_timer()
'画
draw
60,
60,
40
end
sub
实际上,程序代码比较简单。最复杂的应该是几何问题。
我们设,轮是主动地,是匀速运动的,初始位置为水平向右隐羡脊,方向为正方向。
运动速率为Alhpa弧度美秒。
时刻t,L1与水平线的灶渗夹角为:t*Alhpa
以轮心为原点,建立直角坐标系。
那么,L1和L2铰接点的坐标就是(L1*cos(t*alhpa),L1*sin(t*alhpa)),表示为(X1,Y1)
剩下的问题,就是计算滑块上的铰接点的坐标了。
设这点的坐标是(x,e)
那么有方程:
[x-L1*cos(t*alhpa)]*[x-L1*cos(t*alhpa)]+[L1*sin(t*alhpa)-e]*[L1*sin(t*alhpa)-e]=L2*L2
这个方程里面只有x是未知数,是一个典型的一元二次方程,可以用公式法求解。舍弃小于L1与L2交接点横坐标的一个解,其余一个就是我们的目标。
至此,任意时刻的位置,我们都可以确定派宴了。
下面就是怎么用vb来画图了。
这里运动的有三件:L1、L2和滑块。
不运动的有圆、圆轴、基准线、滑块的移动平面。
不运动的,我们用窗体的方法line、Circle来实现(注意:滑块的移动平面不要画那么高,画到滑块下面)。
移动的用两个line控件和一个shape控件来表示。
另外就是辅助的控件了,例如设置、开始、数据输出等等这些就不说了,核心的辅助控件就是计时器。
设置好参数之后,在开始的地方
Me.Scale (-L1 - L1, L1 + L1 + e)-(L1 + L1 + L2, -L1 - L1)
line1.x2=0
line1.y2=0
shape.top=e+shape1.height/2
画上不运动的部分。
在计时器的事件里
1、计算当前角度
2、计算(x1,y1)
3、计算x
上面三个计算代码你自己写。
line1.x1=x1
line1.y1=y1
line2.x1=x1
line2.y1=y1
line2.x2=x
line2.y2=e
shape1.left=x-shape1.width/2
如果还有问题,我们以后再讨论。
可以。运动组件侍族的代码可以查到。
不过我手头没有。
你用录制宏查看一下添加约束、添加扭转力的指令
然后调取函数赋值就可以了。
因为如果曲柄滑块机构的各零部件伍清装配完全,应该不需要用到遍历技术,也不需要事件触发,所以只要一条程序链就够了。
关键还是在添加扭转力的指令,你用录制宏查看完之后,在帮助里对该指令查找一下就没什么大问题了。
顺便提一句,以上内容至对熟悉API的人老橘弊适用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)