掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
直線上の座標かどうか (ID:27621)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
「いちあん 」さんの回答を見て思いつきました。 何をやっているのかはコードから判断してください。 なお、p1,p2は線分の両端を表す変数で、p1,p2:TPointです。 p0,px,q1,q2も同様にTPoint変数です。 q1:=p1; q2:=p2; px.X:=x;//クリックした点 px.Y:=y; p0:=px; if _r(q1,px)>_r(q2,px) then begin q1:=p2; q2:=p1; end;//クリックした点より遠い点を基準点とする q1.X:=q1.X-q2.X; q1.Y:=q1.y-q2.Y; px.X:=px.X-q2.X; px.Y:=px.Y-q2.Y; r:=q1.Y*px.X-q1.X*px.Y; //=|q1|*|px|*sin(φ) r:=r/sqrt(sqr(q1.X)+sqr(q1.Y))/sqrt(sqr(px.X)+sqr(px.Y)); //=sin(φ) if (abs(r)<0.005) and WithinRange(p1,p2,p0) then label1.Caption:='On the line';//0.005は誤差限界の例 else label1.Caption:='Out of the line'; **************** 2点間の距離の2乗を求める function TForm1._r(z1,zx:TPoint):double; begin result:=sqr(z1.X-zx.X)+sqr(z1.Y-zx.Y); end; ***************** 線分の範囲内かどうかの判断 function TForm1.WithinRange(org,term,click:TPoint):boolean; var large,small,buff:integer; begin if abs(org.X-term.X)>abs(org.Y-term.Y) then begin //x軸で評価 large:=org.X; small:=term.X; if small>large then begin large:=term.X; small:=org.X; end; result:=(click.X<=large) and (click.x>=small); end else begin //y軸で評価 large:=org.Y; small:=term.Y; if small>large then begin large:=term.Y; small:=org.Y; end; result:=(click.Y<=large) and (click.Y>=small); end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.