PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   高手請教VB6程式,兩個字串比較,程式碼如何作執行速度才會快 (https://www.pcdvd.com.tw/showthread.php?t=858377)

songmong12 2009-06-27 12:14 AM

引用:
作者nyko
先謝過

雖然看不懂那幾行程式
我只懂VB6
但你補的箭頭方向我應該懂你的意思

我的寫法是判斷LINE有無跟方框交叉
旦判斷有無交叉實在太多行程式太多狀況
才想有無短一點的判斷法


那是大於小於......把你線的點拿來跟方框的邊界比.......

第一行...就是比對你那條線跟方框上下這兩條線

第二行...就是比對你那條線跟方框左右這兩條線


如果超過...就是在框的外面......

所以傳回true的機會只有滿足判斷的時候.....

nyko 2009-06-27 01:12 AM



那你那2行程式應該只符合圖中上行右邊第5個
我需要的是11個都符合
方框有摸到線都算成立
所以我才寫成LINE判斷有無跟方框交叉

songmong12 2009-06-27 12:26 PM

引用:
作者nyko
http://xs940.xs.to/xs940/09265/hhhh609.png (http://xs.to)

那你那2行程式應該只符合圖中上行右邊第5個
我需要的是11個都符合
方框有摸到線都算成立
所以我才寫成LINE判斷有無跟方框交叉


沒錯.....當時我的想法的確是認為像是第五圖......

等等看有空的時候再想一下....

這時候不禁想要說了.....
我明明已經脫離這個圈子好久了 :jolin: :jolin: :jolin: :jolin: :jolin:

想這個是身體健康的嗎? :laugh: :laugh: :laugh: :laugh:

supermaxfight 2009-06-28 04:57 PM

好了,大致上把程式人員的面試心得及基本原則裡面的
1-2+3-4+5-6+7......+n
生出來了

至於時間能節省多少...

以100億為例,執行最初的那個程式碼用Pentium M 1.3GHz約390秒左右
偷吃步那個考官的算法
約....0.0005秒....

插個小問題一下
VB的console介面,我是寫成輸入n然後執行,接著停住
怎麼把它改成執行完後可以再輸入n然後讓它繼續執行

songmong12 2009-06-28 05:49 PM

引用:
作者supermaxfight
好了,大致上把程式人員的面試心得及基本原則裡面的
1-2+3-4+5-6+7......+n
生出來了

至於時間能節省多少...

以100億為例,執行最初的那個程式碼用Pentium M 1.3GHz約390秒左右
跑偷吃步那個考官的算法
約....0.0005秒....


那個不算偷吃步喔.....文章裡面主考官有說到
電腦是為了使用者服務的,不是為了你的程式服務的

要是以前我用您的方法的話....大概會被老闆打槍打到死吧....

不過...說句真的...我以前老闆那邊....公司也都是一堆怪物阿
我是唯一台灣的軟體工程師....幹的很辛苦阿

因為他們的程度真的是很高阿.......他們是訓練的好 + 經驗老到

我是因為拼了很久跟不上他們才走的

另外...回一下nyko

你的程式我有推了一點過程....的確是有點麻煩的

你可能有想過....交叉的情形多不勝數
所以可以試著反向思考....不交叉的情形,可能會簡單一點

目前我是用這個方向來想的....還有一些公式的問題要克服

因為不要用既有的函式...可能就要全部自己推算

nyko 2009-06-28 06:29 PM

小X=Line.X1
小Y=Line.Y1
大X=Line.X2
大Y=Line.Y2
'讓線的上方點保持為小Y 下方點為大Y 以後好作線有無交叉的判斷
If (大X - 小X < 0 And 大Y - 小Y < 0) Or (大X - 小X > 0 And 大Y - 小Y < 0) Then
暫存 = 大Y
大Y = 小Y
小Y = 暫存
暫存 = 大X
大X = 小X
小X = 暫存
End If


線左斜至右 = False
If (大X - 小X > 0 And 大Y - 小Y > 0) Or (大X - 小X < 0 And 大Y - 小Y < 0) Then
線左斜至右 = True
End If


' A ------------ B
' | |
' | |
' | |
' | |
' D ------------ C
'A B C D 會因 方框行進方向而有所改變 所以要讓 A點C點固定以後好作與線有無交叉的判斷
'----------------判斷方框拉的方向 讓A點 C點X,Y值固定
If X > PicK線.CurrentX And Y > PicK線.CurrentY Then '狀況1 方框由左上往右下拉
A點X = PicK線.CurrentX
A點Y = PicK線.CurrentY
C點X = X
C點Y = Y
ElseIf X < PicK線.CurrentX And Y > PicK線.CurrentY Then '狀況2 方框由右上往左下拉
A點X = X
A點Y = PicK線.CurrentY
C點X = PicK線.CurrentX
C點Y = Y
ElseIf X < PicK線.CurrentX And Y < PicK線.CurrentY Then '狀況3 方框由右下往左上拉
A點X = X
A點Y = Y
C點X = PicK線.CurrentX
C點Y = PicK線.CurrentY
ElseIf X > PicK線.CurrentX And Y < PicK線.CurrentY Then '狀況4 方框由左下往右上拉
A點X = PicK線.CurrentX
A點Y = Y
C點X = X
C點Y = PicK線.CurrentY
End If


'-----算出方框各邊與線的交叉點 Line 左斜 右斜 算法不一樣
If 線左斜至右 = True Then
ABX交叉點 = 小X + (A點Y - 小Y) / (大Y - 小Y) * (大X - 小X)
BCY交叉點 = 大Y - (大X - C點X) / (大X - 小X) * (大Y - 小Y)
CDX交叉點 = 小X + (C點Y - 小Y) / (大Y - 小Y) * (大X - 小X)
DAY交叉點 = 大Y - (大X - A點X) / (大X - 小X) * (大Y - 小Y)
Else
ABX交叉點 = 小X - Abs(A點Y - 小Y) / Abs(大Y - 小Y) * Abs(大X - 小X) 'Abs 負的變正的
BCY交叉點 = 大Y - Abs(大X - C點X) / Abs(大X - 小X) * Abs(大Y - 小Y)
CDX交叉點 = 小X - Abs(C點Y - 小Y) / Abs(大Y - 小Y) * Abs(大X - 小X)
DAY交叉點 = 大Y - Abs(大X - A點X) / Abs(大X - 小X) * Abs(大Y - 小Y)
End If


'---------最後判斷線與方框交叉 或整條被框住
If (ABX交叉點 > A點X And ABX交叉點 < C點X And ((A點Y - 小Y > 0 And A點Y - 大Y < 0) Or (A點Y - 大Y > 0 And A點Y - 小Y < 0)))
Or (BCY交叉點 > A點Y And BCY交叉點 < C點Y And ((C點X - 小X > 0 And C點X - 大X < 0) Or (C點X - 大X > 0 And C點X - 小X < 0)))
Or (CDX交叉點 > A點X And CDX交叉點 < C點X And ((C點Y - 小Y > 0 And C點Y - 大Y < 0) Or (C點Y - 大Y > 0 And C點Y - 小Y < 0)))
Or (DAY交叉點 > A點Y And DAY交叉點 < C點Y And ((A點X - 小X > 0 And A點X - 大X < 0) Or (A點X - 大X > 0 And A點X - 小X < 0)))
Or (A點X < 小X And 小X < C點X And A點Y < 小Y And 小Y < C點Y)
Or (A點X < 大X And 大X < C點X And A點Y < 大Y And 大Y < C點Y) Then
'-------啊 被框住了
End If



IF end 程式都有留空白 可是好像空白都不見了 程式都擠到最前面

落落長的程式
只是想有沒有比較短的

Adsmt 2009-06-28 06:58 PM

如果你的方框都是平行於 x, y 軸的,那就好辦。

框的四條線必是 x1=a, x2=b, y1=c, y2=d (一開始就知道了,不必算)
而只要不平行的線,必定會相交,所以你只要算,該線(延伸)和框線的相交點是否落在線段和框線上。

這些只用到國中數學,不會太難,而且也不怕有沒考慮到的情況。

影 子 2009-06-28 08:26 PM

引用:
作者nyko
http://xs940.xs.to/xs940/09265/hhhh609.png (http://xs.to)

那你那2行程式應該只符合圖中上行右邊第5個
我需要的是11個都符合
方框有摸到線都算成立
所以我才寫成LINE判斷有無跟方框交叉

小弟也來儘一點微薄之力
由於手中沒有國中數學
要完成這個程式
有點困難
不過你可以試著看我以下的說明

首先
你的圖中最上面那排的五個方形
有一個共通點
那就是直線的兩個點中(一條直接至少有兩個點)
至少有一點在方形之內
所以此部分的程式應該不難
只要判斷直線的某一點在方形內
表示就是OK

接下來
下面六個圖形
有共通點
那就是直線的兩個點
一定是在方形之外
而且必定會和方形的任兩邊作相交
(相交必然產生兩個點)
所以只要判斷
相交的那兩個點是否在方形的邊上
就對了
這部分的程式
應該用到國中數學
直線相交
祝好運

nyko 2009-06-28 09:37 PM



圖上行4個情況是在所有狀況內最難寫的



我是以斜線行成的虛擬三角形以大三角形與小三角形的比例算出與方框的交叉點
(讓我想好久才想出的方法)

影 子 2009-06-28 10:22 PM

引用:
作者nyko
http://xs940.xs.to/xs940/09260/5656667.png (http://xs.to)

圖上行4個情況是在所有狀況內最難寫的



我是以斜線行成的虛擬三角形以大三角形與小三角形的比例算出與方框的交叉點
(讓我想好久才想出的方法)

你這樣寫
程式會有些錯誤
例如:它不是形成三角形,而是形成四邊形時(直線與方形上下兩邊相交時)

另外,
直線與方形,相交於一個點時的情況,你並沒有提到(也就是方形的四個點)

還有,
不知你有考慮到,萬一直線與方形的四邊的任一邊重疊時


所有的時間均為GMT +8。 現在的時間是11:22 PM.

vBulletin Version 3.0.1
powered_by_vbulletin 2026。