广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 3111 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
tk7545
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x0
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x0
[Basic][求助] 利用 Timer 进行 data 的累加计算【尚未解决】
各位大大好:

       小弟有一个Timer的问题想要请教大家,直接切入主题

=======================================================

假设我有一.data档(笔记本 ..

访客只能看到部份内容,免费 加入会员 或由脸书 Google 可以看到全部内容



献花 x0 回到顶端 [楼 主] From:台湾教育部 | Posted:2010-01-26 10:05 |
ebolaman 手机 会员卡
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖

级别: 副版主 该用户目前不上站
版区: 程式设计
推文 x38 鲜花 x458
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

这是我刚刚做的,参考一下吧 表情

我把档案设定在同资料夹下的 Pos.txt 里面

格式是  X,Y  例如

1,4
2,5
3,6

不过既然你给三个数值,那么程式可能就会绘出两条以上的线,取决于在 Pos.txt 的资料行数有几个 - 1

先创建 一些元件在 Form1 ,以下格式是  元件:名称

按钮(CommandButton):CMD_OK
文字框(TextBox):Text_See
计时器(Timer):Timer_MoveLine
标签(Label):Label_Slope
图片(PictureBox):Pic

还有要一个模组

不过我有把专案上传,可以直接下载专案来看

我是还有加几个东西,例如斜率的显示、座标的显示,那些都可以删除



以下在  MainForm 表单:

复制程式
 

Option Explicit 

Dim PtX As New Collection 
Dim PtY As New Collection 

Dim Dis As Long 
Dim DataCount As Long 
Dim TimeAddUp As Long 
Dim TimeSep As Long 

Dim OriX As Long 
Dim OriY As Long 

'Made By EbolaMan, 哪里不懂就回复吧 

Private Sub CMD_OK_Click() 

ApplyPos 

Timer_MoveLine.Enabled = True 

RefreshStatus '@@@@ Test Sub 

End Sub 

Private Sub Form_Initialize() 

'-------------- Ini. Constant Obj -------------- 

Set fso = CreateObject("Scripting.FileSystemObject") 


End Sub 

Private Sub Form_Load() 

Dim tempS As String 
Dim txtpath As String 
Dim ArrText() As String 
Dim i As Long 

'-------------- Set Program-Local Array Data ------------- 


'## Way1 这是不用开启资料夹下的档案就可以直接绘图的程式码,与底下的择一,不过依照你的方法,应该是要下面那种 

'PtX.Add 1 
'PtX.Add 2 
'PtX.Add 3 
' 
'PtY.Add 4 
'PtY.Add 5 
'PtY.Add 6 


'## Way2 开启资料夹下的档案读取 POS 值 

txtpath = App.Path & "\Pos.txt" '读取资料夹下的 Pos.txt ,可改 

tempS = LoadData(txtpath) 

ReDim Pt(0, 1) 
If tempS <> "" Then 
ArrText = Split(tempS, vbCrLf) 

For i = 0 To UBound(ArrText) 
LoadNewPos Trim(ArrText(i)) 
Next i 

End If 


'------------- Ori Pos --------------- 
If DataCount <> 0 Then 
OriX = PtX.Item(1) 
OriY = PtY.Item(1) 
End If 


'---------------- Ini. Variable --------------- 
Dis = 100 '为避免点的值太小,加入 Distance 来增加点与点的距离,此项设 1 则是原本的点值,越大点的距离越大 

'DataCount = 3 '与 Way1 连用,Way 1 失效此也失效 

TimeAddUp = 0 

TimeSep = 1000 '每次更新 LINE 时间的间隔 

'--------- Ini. Obj --------- 

With Pic 

.AutoRedraw = True 
.DrawWidth = 2 

End With 

Timer_MoveLine.Interval = TimeSep 


End Sub 

Public Sub ApplyPos() 

Dim i As Long 

Dim tempX As Double 
Dim tempY As Double 

Pic.Cls 
For i = 1 To DataCount - 1 
'画出实线 
Pic.DrawWidth = 2 
Pic.DrawStyle = 0 
Pic.Line (PtX.Item(i) * Dis, PtY.Item(i) * Dis)-(PtX.Item(i + 1) * Dis, PtY.Item(i + 1) * Dis), RGB(0, 0, 0) 

'画出原点到最近实线 
Pic.DrawWidth = 5 
Pic.PSet (OriX * Dis, OriY * Dis), RGB(10, 120, 240) 

'画出原点 
Pic.DrawWidth = 1 
Pic.DrawStyle = 2 
Pic.Line (OriX * Dis, OriY * Dis)-(PtX.Item(i) * Dis, PtY.Item(i) * Dis) 

'计算斜率 
tempX = (PtX.Item(i + 1) - PtX.Item(i)) 
tempY = (PtY.Item(i + 1) - PtY.Item(i)) 
If tempY <> 0 Then 
Label_Slope = "Slope = [Selected] " & Format(tempX / tempY, "0.0##") 
Else 
Label_Slope = "Slope = [Selected] No " 
End If 

tempX = (PtX.Item(i) - OriX) 
tempY = (PtY.Item(i) - OriY) 
If tempY <> 0 Then 
Label_Slope = Label_Slope & " [From Ori] " & Format(tempX / tempY, "0.0##") 
Else 
Label_Slope = Label_Slope & " [From Ori] No " 
End If 

Next i 

End Sub 

Public Sub ApplyNewLinePos(ByVal Ind As Long, ByVal Value As Long) 

Dim i As Long 

For i = 1 To DataCount 
ResetValue Ind, i, IIf(Ind = 0, PtX.Item(i), PtY.Item(i)) + Value 
Next i 

End Sub 

Private Sub Timer_MoveLine_Timer() 

TimeAddUp = TimeAddUp + 1 'Before 

ApplyNewLinePos 0, 1 
ApplyNewLinePos 1, 1 


ApplyPos 

RefreshStatus '@@ Test Sub 


End Sub 

Public Sub LoadNewPos(ByVal S As String) 

Dim m As Long 
Dim Pos_X As Long 
Dim Pos_Y As Long 

On Error Resume Next 

If Trim(S) = "" Then Exit Sub 

m = InStr(1, S, ",") 

Pos_X = Trim(Left(S, m - 1)) 
Pos_Y = Trim(Right(S, Len(S) - m)) 


PtX.Add Pos_X 
PtY.Add Pos_Y 

DataCount = DataCount + 1 

End Sub 

Public Sub ResetValue(ByVal X_or_Y_0_or_1 As Integer, ByVal Floor As Long, ByVal Value As Long) 

On Error Resume Next 

If X_or_Y_0_or_1 = 0 Then 

PtX.Remove Floor 
If Floor - 1 >= PtX.Count Then 
PtX.Add Value 
Else 
PtX.Add Value, , Floor 
End If 

Else 

PtY.Remove Floor 
If Floor - 1 >= PtY.Count Then 
PtY.Add Value 
Else 
PtY.Add Value, , Floor 
End If 

End If 


End Sub 

Public Sub RefreshStatus() '@@@@ Test Sub 

Dim i As Long 

Text_See.Text = "" 
For i = 1 To 3 
Text_See.Text = Text_See.Text & "(" & PtX.Item(i) & ", " & PtY.Item(i) & ")" & vbCrLf 
Next i 

End Sub 





以下在 File 模组:

复制程式
 

Option Explicit 

Public fso As FileSystemObject '此模组最主要都是用这种 FileSystemObject 来使用写入写出功能,如果你不喜欢就把此模组砍了吧 
'如果启用,请记得引用项目 Microsoft Script Runtime 

Public Function LoadData(ByVal FileName As String) As String 

'Dim f As New FileSystemObject 
Dim tempTextStream As TextStream 

On Error Resume Next 
Set tempTextStream = fso.OpenTextFile(FileName) 

LoadData = "" 
If Not tempTextStream.AtEndOfStream Then 
LoadData = tempTextStream.ReadAll 
tempTextStream.Close 
End If 

End Function 

Public Sub WriteData(ByVal FileName As String, ByVal WrittenMes As String) 

Dim fr As Long 
'Dim f As New FileSystemObject 
Dim tempTextStream As TextStream 

On Error Resume Next 

Set tempTextStream = fso.CreateTextFile(FileName) 
tempTextStream.Write WrittenMes 
tempTextStream.Close 

End Sub 

Public Sub WriteData_Add(ByVal FileName As String, ByVal WrittenMes As String) 

Dim f As Long 

f = FreeFile 
Open FileName For Append As #f 
Print #f, WrittenMes 
Close #f 

End Sub 

Public Function FileExt(ByVal FileN As String) As Boolean 

FileExt = IIf(Dir(FileN, vbNormal Or vbHidden Or vbReadOnly Or vbSystem) <> "", True, False) 

End Function 




本帖包含附件
zip MovingLine.rar   (2022-06-09 14:13 / 4 KB)   下载次数:8

此文章被评分,最近评分记录
财富:50 (by 三仙) | 理由: ^^ 因为您的参与,让程式设计更容易!!


My BOINC stats :

献花 x2 回到顶端 [1 楼] From:台湾台湾宽频 | Posted:2010-01-26 21:48 |
ebolaman 手机 会员卡
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖

级别: 副版主 该用户目前不上站
版区: 程式设计
推文 x38 鲜花 x458
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

对了,刚刚看一下程式码发现

表单程式码里面,有 ReDim Pt(0, 1) ,这是原本用来记录点的 阵列

不过由于不好用,后来砍了,这行是残存的,可以删除

还有绘线的第二行注解 不是实线是虚线...

有点懒得重修改文章... 表情

AND,感谢版主~


[ 此文章被ebolaman在2010-01-26 22:21重新编辑 ]


My BOINC stats :

献花 x0 回到顶端 [2 楼] From:台湾台湾宽频 | Posted:2010-01-26 22:12 |
tk7545
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x0
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

谢谢大大:

       真的很感谢大大的帮助,程式可以写成这样真不简单,这是我程式的初步构想

      不知道大大能不能利用你的程式,帮我想想看之后我的程式该怎么改

======================================================================

其实我的data档是一条弧线,也是由X跟Y轴组成

我希望让这条弧线绕着原点(0.0)转圈

唯一想到的办法就是利用转置矩阵来让弧线旋转

原本的
X   Y
1   4
2   5
3   6

程式是以TIMER一直加1上去,完成线条移动的感觉

现在是要将弧线绕圈,所以方程式的部份就要由原本的加1,换成转置矩阵

X1=X*Cos(t)-Y*Sin(t)

Y1=X*Sin(t)-Y*Cos(t)

因为要绕一圈,所以(t)则是1 to 360

原理跟原本的应该一样,想要请教大大,我有没有可能利用大大的程式

办到能让一条弧线达到有转圈的效果呢? 麻烦大大了!


献花 x0 回到顶端 [3 楼] From:台湾教育部 | Posted:2010-01-27 13:38 |
ebolaman 手机 会员卡
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖

级别: 副版主 该用户目前不上站
版区: 程式设计
推文 x38 鲜花 x458
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

下面是引用 tk7545 于 2010-01-27 13:38 发表的 : 到引言文
谢谢大大:

       真的很感谢大大的帮助,程式可以写成这样真不简单,这是我程式的初步构想

      不知道大大能不能利用你的程式,帮我想想看之后我的程式该怎么改

======================================================================

其实我的data档是一条弧线,也是由X跟Y轴组成

我希望让这条弧线绕着原点(0.0)转圈

唯一想到的办法就是利用转置矩阵来让弧线旋转

原本的
X   Y
1   4
2   5
3   6

程式是以TIMER一直加1上去,完成线条移动的感觉

现在是要将弧线绕圈,所以方程式的部份就要由原本的加1,换成转置矩阵

X1=X*Cos(t)-Y*Sin(t)

Y1=X*Sin(t)-Y*Cos(t)

因为要绕一圈,所以(t)则是1 to 360

原理跟原本的应该一样,想要请教大大,我有没有可能利用大大的程式

办到能让一条弧线达到有转圈的效果呢? 麻烦大大了!



我目前是做好了

今天群健一直不让我上网,终于在 PM 8:00 修好了 表情

由于东西有点多,我打算打在新的一篇文章

在这里:http://bbs-mychat.com/reads.php?tid=849871


[ 此文章被ebolaman在2010-01-28 10:38重新编辑 ]


My BOINC stats :

献花 x0 回到顶端 [4 楼] From:台湾台湾宽频 | Posted:2010-01-27 23:43 |

首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.043336 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言