2011-03-25 46 views
0

我有一個由x1,y1,x2,y2表示的線段,它們是雙值。然後我有 幾個圖形對象(讓我們命名類TShape),其中座標 是左,上,右,下:雙。只有Top和Left屬性可寫入 值。拖動頂部和左側值時更新TShape。力點在一條線上

當TShape靠近一條線時,我正在使用函數進行發現。功能 定義是:如果目標指定點附近點1 和點2指定的行

function NearLine(const Target: TPoint; X1, Y1, X2, Y2: double; Off: integer = 5): boolean; 

近線返回true。該點必須在Off指定的距離處。

我使用函數Off = 0;

在我的實現中,目標是我不斷更新的TShape的中心 從Top和Left屬性計算它。因爲目標是 我TPoint做:

1-

CPoint.X := Trunc(Center.X); 
CPoint.Y := Trunc(Center.Y); 

2- 和當上述的功能的近線爲真我迫使鼠標釋放:

3-

Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); 

1,2和3在被調用的事件UpdateMove中調用,而 拖動形狀。

這讓我「貼」TShape幾乎在線附近,但它不是 正是我想要的......顯然有一個錯誤,由於Trunc函數。
錯誤是:釋放鼠標

deltaX := Frac(Center.X); 
deltaY := Frac(Center.Y); 

後編程我怎麼能強制所有與 線中心 因此所有的形狀完美內襯(共線)?

任何幫助? :(

+0

如果你點的是不是已經共線(和你需要3分,因爲兩個p oints總是共線),您可以強制它們由包裹空間,並讓他們走線槽的第四維(時間共線) – 2011-03-25 13:11:09

+0

@Cosmin:愛評論。必須預期程序員2程序員站點上的直線響應:) – sehe 2011-03-25 13:16:11

+0

請您格式化問題,以便它易於閱讀。 – 2011-03-25 13:33:21

回答

4

你問這個問題是錯誤的,這就是爲什麼你不能'看到你自己的答案。如果3點不共線,你不會「強迫」他們的直線,除非你改變法律數學和/或物理學

你可能想要的是找到一個點,由兩個最接近你的參考點的點所定義的線,這是非常簡單的幾何:最接近的點是在從你的第三個點由前兩個定義的線的垂線!你能解決單獨使用Pythagoran理論,你甚至不需要花哨的解析幾何。

+0

任何代碼示例?:( – marcostT 2011-03-25 14:16:39

+0

我們需要一個mathoverflow站點嗎? - 哎呀我會問,而不是 – sehe 2011-03-25 14:20:25

+0

@sehe:http://math.stackexchange.com已經存在... – Martijn 2011-03-25 14:34:14