![]() |
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)
|
|---|
引用:
那是大於小於......把你線的點拿來跟方框的邊界比....... 第一行...就是比對你那條線跟方框上下這兩條線 第二行...就是比對你那條線跟方框左右這兩條線 如果超過...就是在框的外面...... 所以傳回true的機會只有滿足判斷的時候..... |
|
引用:
沒錯.....當時我的想法的確是認為像是第五圖...... 等等看有空的時候再想一下.... 這時候不禁想要說了..... 我明明已經脫離這個圈子好久了 :jolin: :jolin: :jolin: :jolin: :jolin: 想這個是身體健康的嗎? :laugh: :laugh: :laugh: :laugh: |
好了,大致上把程式人員的面試心得及基本原則裡面的
1-2+3-4+5-6+7......+n 生出來了 至於時間能節省多少... 以100億為例,執行最初的那個程式碼用Pentium M 1.3GHz約390秒左右 跑偷吃步那個考官的算法 約....0.0005秒.... 插個小問題一下 VB的console介面,我是寫成輸入n然後執行,接著停住 怎麼把它改成執行完後可以再輸入n然後讓它繼續執行 |
引用:
那個不算偷吃步喔.....文章裡面主考官有說到 電腦是為了使用者服務的,不是為了你的程式服務的 要是以前我用您的方法的話....大概會被老闆打槍打到死吧.... 不過...說句真的...我以前老闆那邊....公司也都是一堆怪物阿 我是唯一台灣的軟體工程師....幹的很辛苦阿 因為他們的程度真的是很高阿.......他們是訓練的好 + 經驗老到 我是因為拼了很久跟不上他們才走的 另外...回一下nyko 你的程式我有推了一點過程....的確是有點麻煩的 你可能有想過....交叉的情形多不勝數 所以可以試著反向思考....不交叉的情形,可能會簡單一點 目前我是用這個方向來想的....還有一些公式的問題要克服 因為不要用既有的函式...可能就要全部自己推算 |
小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 程式都有留空白 可是好像空白都不見了 程式都擠到最前面 落落長的程式 只是想有沒有比較短的 |
如果你的方框都是平行於 x, y 軸的,那就好辦。
框的四條線必是 x1=a, x2=b, y1=c, y2=d (一開始就知道了,不必算) 而只要不平行的線,必定會相交,所以你只要算,該線(延伸)和框線的相交點是否落在線段和框線上。 這些只用到國中數學,不會太難,而且也不怕有沒考慮到的情況。 |
引用:
小弟也來儘一點微薄之力 由於手中沒有國中數學 要完成這個程式 有點困難 不過你可以試著看我以下的說明 首先 你的圖中最上面那排的五個方形 有一個共通點 那就是直線的兩個點中(一條直接至少有兩個點) 至少有一點在方形之內 所以此部分的程式應該不難 只要判斷直線的某一點在方形內 表示就是OK 接下來 下面六個圖形 有共通點 那就是直線的兩個點 一定是在方形之外 而且必定會和方形的任兩邊作相交 (相交必然產生兩個點) 所以只要判斷 相交的那兩個點是否在方形的邊上 就對了 這部分的程式 應該用到國中數學 直線相交 祝好運 |
|
引用:
你這樣寫 程式會有些錯誤 例如:它不是形成三角形,而是形成四邊形時(直線與方形上下兩邊相交時) 另外, 直線與方形,相交於一個點時的情況,你並沒有提到(也就是方形的四個點) 還有, 不知你有考慮到,萬一直線與方形的四邊的任一邊重疊時 |
| 所有的時間均為GMT +8。 現在的時間是11:22 PM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2026。