注册 登录
编程论坛 VB6论坛

指导下,咋红色圆不围绕黑色圆做圆周运动??谢谢了,指导下

V菜鸟V 发布于 2014-12-09 13:39, 1331 次点击
只有本站会员才能查看附件,请 登录
29 回复
#2
V菜鸟V2014-12-09 13:45
这是我写的代码,可有点问题,麻烦看看了,谢谢。
程序代码:
Option Explicit
Dim xa(-360 To 360) As Double
Dim ya(-360 To 360) As Double
Const PI = 3.14159
Public Sub zuobiao()
Dim L1 As Integer
L1 = Val(Text1.Text)
Dim k1 As Integer
For k1 = 0 To 360
xa(k1) = L1 * Cos(k1 * PI / 180)
ya(k1) = L1 * Sin(k1 * PI / 180)
Next k1
End Sub
Private Sub Command1_Click()
Timer1.Enabled = True
Picture1.Cls
End Sub

Private Sub Form_Load()
Picture1.Scale (-80, 80)-(80, -80)
Picture1.Circle (0, 0), 10, RGB(0, 0, 0)
Picture1.Circle (20, 0), 10, RGB(255, 0, 0)
Picture1.Line (0, 0)-(20, 0), RGB(0, 0, 0)
End Sub

Private Sub Timer1_Timer()
Call zuobiao
Dim k2 As Integer
Picture1.Circle (0, 0), 10, RGB(0, 0, 0)
Picture1.Circle (xa(k2), ya(k2)), 10, RGB(255, 0, 0)
Picture1.Line (0, 0)-(xa(k2), ya(k2)), RGB(0, 0, 0)
End Sub
#3
V菜鸟V2014-12-09 13:46
#4
V菜鸟V2014-12-09 13:49
只有本站会员才能查看附件,请 登录
#5
V菜鸟V2014-12-09 13:50
回复 3楼 V菜鸟V
只有本站会员才能查看附件,请 登录
#6
V菜鸟V2014-12-09 13:52
谢谢了,帮帮忙,麻烦了,谢谢了,他老是不运动,我的意思是课一看见他运动的过程,就和手表指针一样的运动,代码写好了,有点问题,期望您能指导一下,谢谢了。
#7
lianyicq2014-12-09 13:57
大致看了看代码.
你在一个时间间隔内执行一次zuobiao就把xa(k1),ya(k1)从0到360重新算一次值.其结果就是得到两组固定值的数组.
另外一个时间间隔,定义一次k2,显然每次都是在timer1_timer过程中,每次都是在xa(0),ya(0).处画圆.由第一个问题可知,xa(0)=L1,ya(0)=0.根本不会发生改变,
由此圆转不起来
#8
txxb2014-12-09 14:04
咋看着这么麻烦,我做的钟表和三球运动比这个简单多了
#9
V菜鸟V2014-12-09 14:13
回复 7楼 lianyicq
那怎么改一下,可以转动起来?谢谢了
#10
lianyicq2014-12-09 14:19
回复 9楼 V菜鸟V
只有本站会员才能查看附件,请 登录

问题比较多,在你原代码基础上调了一下.除了代码,注意看窗体和图形控制的属性
#11
xzlxzlxzl2014-12-09 14:20
你的代码没多少关联性嘛,既然你已经把运动坐标都存进数组,那你应该在时钟事件里循环读数组才能转起来,在就是数组维数只需要0-359,不需要-360-360,你在过程zubiao里也是从0-360存的,和你定义的数组维数矛盾。代码改如下可转起来。
Option Explicit
Dim Round As Integer
Const PI = 3.14159
Private Sub Command1_Click()
Timer1.Interval = 100
Timer1.Enabled = True
End Sub

Private Sub Form_Load()
Picture1.Scale (-80, 80)-(80, -80)
Picture1.Circle (0, 0), 10, RGB(0, 0, 0)
Picture1.Circle (20, 0), 10, RGB(255, 0, 0)
Picture1.Line (0, 0)-(20, 0), RGB(0, 0, 0)
End Sub

Private Sub Timer1_Timer()
Dim x As Integer, y As Integer
Dim L1 As Integer
L1 = Val(Text1.Text)
x = L1 * Cos(Round * PI / 180)
y = L1 * Sin(Round * PI / 180)
Picture1.Cls
Picture1.Circle (0, 0), 10, RGB(0, 0, 0)
Picture1.Circle (x, y), 10, RGB(255, 0, 0)
Picture1.Line (0, 0)-(x, y), RGB(0, 0, 0)
Round = Round + 1
If Round = 360 Then Round = 0
End Sub
#12
风吹过b2014-12-09 14:24
Private Sub Timer1_Timer()
Call zuobiao
Static k2 As Integer
k2 = k2 + 2
If k2 > 360 Then k2 = 0

Picture1.Circle (0, 0), 10, RGB(0, 0, 0)
Picture1.Circle (xa(k2), ya(k2)), 10, RGB(255, 0, 0)
Picture1.Line (0, 0)-(xa(k2), ya(k2)), RGB(0, 0, 0)
End Sub

我没改你程序的结构,只改了这个错误的地方,其他地方我没看。你自己琢磨吧,感觉 Call zuobiao 在程序里应该只需要调用一次就可以了。
#13
V菜鸟V2014-12-09 14:26
回复 10楼 lianyicq
谢谢,麻烦您了,每次都是您帮忙,谢谢您了,这个就是上回哪个运动图,我开始搞了,嘿嘿,下回不会了,麻烦您再指导,谢谢您了,,,,
#14
V菜鸟V2014-12-09 14:27
回复 11楼 xzlxzlxzl
谢谢,版主,嘿嘿
#15
V菜鸟V2014-12-09 14:27
回复 11楼 xzlxzlxzl
谢谢,谢谢
#16
txxb2014-12-09 14:32
设定一个角速度k,圆所处位置的仰角为kk,试试。很简单
kk=0
Private Sub Timer1_Timer()
kk=kk+k
Picture1.Circle (l*cos(kk), l*sin(kk)), 10, RGB(255, 0, 0)
End Sub
#17
V菜鸟V2014-12-09 15:06
回复 10楼 lianyicq
给你看个东西,他就是搞的数组,因为要好多机构那
只有本站会员才能查看附件,请 登录
#18
V菜鸟V2014-12-09 15:07
回复 10楼 lianyicq
只有本站会员才能查看附件,请 登录
你看看他就用的数组,因为机构比较多
#19
V菜鸟V2014-12-09 15:08
回复 10楼 lianyicq
所以我也想搞他的那样的,因为如果是你们设计的那样不能进行连接运用的,,,
#20
V菜鸟V2014-12-09 15:33
回复 11楼 xzlxzlxzl
给你看个东西,就是数组的,因为麻烦,随意我先搞小的
只有本站会员才能查看附件,请 登录
#21
xzlxzlxzl2014-12-09 17:42
回复 19楼 V菜鸟V
唉,你太教条了。用数组可能在过去586时代还有点作用,毕竟计算一次,以后只需访问,可能会提高速度,毕竟浮点运算比较耗时,现在的电脑速度可以只需要运算就行了。为了避免你过于教条,我还是费了点时间修改你提供代码,你看我不用数组也让它转起来了(没花时间去画轨迹,应该也不难)。
'拷贝下述代码到你给我们的工程里,全覆盖原代码

程序代码:
'Option Explicit
Const PI = 3.1415926 '定义π并赋值
Dim BL As Double 'picture的宽/长比例
Dim L1 As Double '曲柄的长度
Dim L2 As Double '连杆的长度
Dim L3 As Double '摇杆的长度
Dim xC As Double 'C点的横坐标
Dim yC As Double 'C点的纵坐标
Dim guaijiao As Double
Dim changdu As Double

Public Sub readdata() '读取输入参数
L1 = Val(shuru(2).Text)
L2 = Val(shuru(3).Text)
L3 = Val(shuru(4).Text)
xC = Val(shuru(0).Text)
yC = Val(shuru(1).Text)
guaijiao = Val(shuru(5).Text)
changdu = Val(shuru(6).Text)
End Sub

Public Function arctan(x1 As Double, y1 As Double, x2 As Double, y2 As Double) As Double '反正切函数
If x1 = x2 Then

 If y1 < y2 Then
  arctan = PI / 2

 Else
  arctan = PI * 3 / 2

 End If
Else

 arctan = Atn((y2 - y1) / (x2 - x1))

 If x1 > x2 Then
  arctan = arctan + PI

 Else
  If y1 > y2 Then
   arctan = arctan + 2 * PI
  End If

 End If
End If
End Function

Public Function arccos(s As Double) As Double '反余弦函数
If s = 0 Then

 arccos = PI / 2
Else

 If s > 0 Then
  arccos = Atn(Sqr(1 - s ^ 2) / s)

 Else
  arccos = Atn(Sqr(1 - s ^ 2) / s) + PI

 End If
End If
End Function

Private Sub Form_Load()
Picture1.AutoRedraw = True '开启自动绘图属性
Call readdata
BL = Picture1.Width / Picture1.Height
Command2_Click
End Sub

Private Sub Command1_Click() '绘制初始位置的图形
Picture1.Cls
Timer1.Enabled = False
Call chushiweizhi
End Sub

Public Sub chushiweizhi() '初始位置绘制过程
Picture1.Scale (-80 * BL, 80)-(80 * BL, -80)
Picture1.Line (0, 0)-(xA(0), yA(0)), RGB(0, 0, 0)
Picture1.Line (xA(0), yA(0))-(xB(0), yB(0)), RGB(0, 0, 0)
Picture1.Line (xB(0), yB(0))-(xC, yC), RGB(0, 0, 0)
Picture1.Line (xA(0), yA(0))-(xG(0), yG(0)), RGB(0, 0, 0)

Picture1.Circle (0, 0), 1, RGB(0, 0, 0)
Picture1.Circle (xA(0), yA(0)), 1, RGB(0, 0, 0)
Picture1.Circle (xB(0), yB(0)), 1, RGB(0, 0, 0)
Picture1.Circle (xC, yC), 1, RGB(0, 0, 0)

Dim k4 As Integer
For k4 = 0 To 359

 Picture1.Line (xG(k4), yG(k4))-(xG(k4 + 1), yG(k4 + 1)), RGB(0, 0, 0)
Next k4

End Sub

Private Sub Command2_Click() '绘制动态运动模拟过程
Picture1.Cls
Timer1.Enabled = True
Timer1.Interval = 50
Picture1.Scale (-80 * BL, 80)-(80 * BL, -80)
End Sub

Private Sub Timer1_Timer() '动态运动模拟过程绘制
Static k2 As Double
Dim k3 As Double
Dim xA As Double, yA As Double, β As Double, det As Double, α3 As Double
Dim xB As Double, yB As Double, α2 As Double, xG As Double, yG As Double
If k2 = 360 Then k2 = 0
If k2 = 0 Then

 k3 = 359
Else

 k3 = k2 - 1
End If
xA = L1 * Cos(k3 * PI / 180): yA = L1 * Sin(k3 * PI / 180)
β = arctan(xC, yC, xA, yA)
det = arccos((L3 ^ 2 + (xA - xC) ^ 2 + (yA - yC) ^ 2 - L2 ^ 2) / (2 * L3 * Sqr((xA - xC) ^ 2 + (yA - yC) ^ 2)))
α3 = det + β
xB = xC + L3 * Cos(α3): yB = yC + L3 * Sin(α3)
α2 = arctan(xA, yA, xB, yB)
xG = xA + changdu * Cos(α2 + PI + guaijiao * PI / 180)
yG = yA + changdu * Sin(α2 + PI + guaijiao * PI / 180)

Picture1.Line (0, 0)-(xA, yA), Picture1.BackColor
Picture1.Line (xA, yA)-(xB, yB), Picture1.BackColor
Picture1.Line (xB, yB)-(xC, yC), Picture1.BackColor
Picture1.Line (xA, yA)-(xG, yG), Picture1.BackColor
Picture1.Circle (0, 0), 1, Picture1.BackColor
Picture1.Circle (xA, yA), 1, Picture1.BackColor
Picture1.Circle (xB, yB), 1, Picture1.BackColor
Picture1.Circle (xC, yC), 1, Picture1.BackColor

xA = L1 * Cos(k2 * PI / 180): yA = L1 * Sin(k2 * PI / 180)
β = arctan(xC, yC, xA, yA)
det = arccos((L3 ^ 2 + (xA - xC) ^ 2 + (yA - yC) ^ 2 - L2 ^ 2) / (2 * L3 * Sqr((xA - xC) ^ 2 + (yA - yC) ^ 2)))
α3 = det + β
xB = xC + L3 * Cos(α3): yB = yC + L3 * Sin(α3)
α2 = arctan(xA, yA, xB, yB)
xG = xA + changdu * Cos(α2 + PI + guaijiao * PI / 180)
yG = yA + changdu * Sin(α2 + PI + guaijiao * PI / 180)

Picture1.Line (0, 0)-(xA, yA), RGB(0, 0, 0)
Picture1.Line (xA, yA)-(xB, yB), RGB(0, 0, 0)
Picture1.Line (xB, yB)-(xC, yC), RGB(0, 0, 0)
Picture1.Line (xA, yA)-(xG, yG), RGB(0, 0, 0)
Picture1.Circle (0, 0), 1, RGB(0, 0, 0)
Picture1.Circle (xA, yA), 1, RGB(0, 0, 0)
Picture1.Circle (xB, yB), 1, RGB(0, 0, 0)
Picture1.Circle (xC, yC), 1, RGB(0, 0, 0)

Dim k5 As Integer
For k5 = 0 To 359
' Picture1.Line (xG(k5), yG(k5))-(xG(k5 + 1), yG(k5 + 1)), RGB(0, 0, 0)
Next k5
k2 = k2 + 1
End Sub

Private Sub Command3_Click() '暂停-开始按钮
If Command3.Caption = "暂停" Then

 Command3.Caption = "继续"

 Timer1.Enabled = False
Else

 Command3.Caption = "暂停"
Timer1.Enabled = True
End If
End Sub

Private Sub Command4_Click(Index As Integer) '微调按钮
If Index Mod 2 = 0 Then

 shuru(Index / 2).Text = Val(shuru(Index / 2).Text) + 3
Else

 shuru((Index + 1) / 2 - 1).Text = Val(shuru((Index + 1) / 2 - 1).Text) - 3
End If
Picture1.Cls
Call readdata
If Timer1.Enabled = False Then Call chushiweizhi '动态更新绘图区域的图形
End Sub
#22
V菜鸟V2014-12-09 20:16
回复 21楼 xzlxzlxzl
给大哥跪了!!!!!厉害,真的谢谢您了,浪费您些时间,不过真心谢谢您了,厉害,我还带再学学,没看懂,新人,谢谢你们的指导,谢谢。
#23
V菜鸟V2014-12-09 20:32
谢谢大家的帮忙了,运动起来,真心谢谢大家的帮忙了,,,,,,嘿嘿
#24
lianyicq2014-12-10 09:05
排除用直观图形对运动进行表述的编程方法。主要涉及了到底是即时进行数据运算还是读取预存数据进行显示的问题。
仿真程序先计算各运动状态数据,占用了较大的内存量,能够减少每一时间间隔数据处理的时间,只需要读取显示即可,对于采用位数少、主频慢的CPU组成的系统效果明显。如果运动系统完全确定,可以采用这种方法。
进行机械运动的物体都有质量,有质量就有惯性。参与运动部件的运动状态都不会突变,采用工控机或PC来仿真,代码即时运算的速度能满足机械运动变化的要求。
即时运算数据一个最突出的优点是预算数据无法比拟的,对于软件本身来说,可以采用人机交互的办法,对输入量、系统状态调整改变,也可以分析干扰、负载变化对系统的影响。
你想用的图形化是运动系统的直观动态反应,这个动态我想不仅是运动起来这么简单吧。
#25
V菜鸟V2014-12-10 17:02
回复 24楼 lianyicq
对,你真厉害,老师就是让我优化的,只不过,我不会,只能先画个模型,先让他动起来,后面再慢慢来呀,毕竟学机械的,VB对我来说难呀,只能慢慢摸索,老师也不会,他只看结果,哎,说多都是泪呀,,,谢谢您了,您太专业了,我什么没给你看,你就指导我要搞什么了,厉害。
#26
V菜鸟V2014-12-10 17:44
回复 24楼 lianyicq
给你看个东西,您空闲的时候可以帮帮看看,实在搞不出来,麻烦您了。
只有本站会员才能查看附件,请 登录
#27
lianyicq2014-12-11 09:33
回复 26楼 V菜鸟V
只有本站会员才能查看附件,请 登录
#28
V菜鸟V2014-12-11 11:40
回复 27楼 lianyicq
嗯嗯呢,看懂了,其实问题就转换成了,只要知道角度2的初始位置的角度,然后就相当于高中时学的数学,进行列方程,然后或者还用数组进行编写,应该就出来了,过几天我去问问老师初始角度看他知道不,恩恩,谢谢了。嘿嘿
#29
V菜鸟V2014-12-14 13:58
回复 7楼 lianyicq
帮忙看看,我的最新的一个贴子吧,动是动起来了,只是规律也太不规则了,谢谢了。
#30
lgp892112017-08-05 19:08
回复 21楼 xzlxzlxzl
太厉害了,大神!
1