如何判斷點在折線的哪一側?
uj5u.com熱心網友回復:
找到最近那個點,根據原點和最近那個點求一個正弦值,根據原點和你那個點那個點求一個正弦值,然后比較一下uj5u.com熱心網友回復:
1、折線圖都由作業表的x,y列陣而來。2、由原點(x1,y1)的x1值,在作業表的列陣中,找到該點垂直線與折線交點,對應作業表中左邊最近的點(xl,y|)和右邊最近的點(xR,yR)。
3、由上述兩個點,得出該折線的中點(x0,y0)值。
4、y1>y0點在折線上方,y1=y0點在折線上,y1<y0點在折線的下方。
uj5u.com熱心網友回復:
能詳細點嗎?比如折線是S型的,然后給出任意一點,判斷這個點在S型折線的哪一側uj5u.com熱心網友回復:
能根據折線創建一個上方的Region, PtInRegion不是一下子就判斷出來了嗎?uj5u.com熱心網友回復:
這是決議幾何問題,S曲線也是這個道理。按我的辦法,建立數學模型,就可以解了。uj5u.com熱心網友回復:
下面是判斷一個點是否在一個多邊形中的代碼,掉有IndexOfPolygon即可。type
TPointX =record
X :double;
Y :double;
end;
TPointList =Array of TPointX;
TPolygonInfo =record
Indx :Byte;
PCount :Word;
P :TPointList;
end;
TLineSegment=record
Pt1 :TPointX;
Pt2 :TPointX;
end;
function Multiply(const p1,p2,p0 :TPointX) :Double;
function IsOnline(P :TPointX;Line :TLineSegment) :Boolean;
function InPolygon(const PolygonInfo :TPolygonInfo; P:TPointX) :Integer;
function Intersect(const L1, L2 :TLineSegment) :Boolean;
const
INFINITY =1.5e10;
ESP =1.5e-5;
MAX_N = 1000;
function Multiply(const p1,p2,p0 :TPointX) :Double;
begin
Result :=((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
end;
// 判斷線段是否包含點point
function IsOnline(P :TPointX;Line :TLineSegment) :Boolean;
begin
Result :=((Abs(Multiply(Line.pt1,Line.pt2,P))< ESP ) and
((P.x-Line.pt1.x )*(P.x-Line.pt2.x )<=0) and
((P.y-line.pt1.y)*(P.y-line.pt2.y)<=0));
end;
// 判斷點在多邊形內
function InPolygon(const PolygonInfo :TPolygonInfo; P:TPointX) :Integer;
var
n :Integer;
I,count :Integer;
Side,Line :TLineSegment;
begin
//int n = polygon.size();
n :=PolygonInfo.PCount;
count := 0;
Line.pt1 :=P;
Line.pt2.y := P.y;
Line.pt2.x := - INFINITY;
for I :=0 to n-1 do
begin
// 得到多邊形的一條邊
Side.pt1 := PolygonInfo.P[I];
Side.pt2 := PolygonInfo.P[(I+1) mod N];
if IsOnline(P, side) then
begin
Result :=1;
end;
// 如果side平行x軸則不作考慮
if ( Abs(side.pt1.y - side.pt2.y) < ESP ) then
begin
continue;
end;
if IsOnline(side.pt1, line) then
begin
if( side.pt1.y > side.pt2.y ) then
Inc(Count);
end
else
if IsOnline(side.pt2, line) then
begin
if( side.pt2.y > side.pt1.y ) then
Inc(Count)
end
else
if Intersect(line, side) then
begin
Inc(count);
end;
end;
if ( count mod 2) = 1 then
Result :=0
else
Result :=2;
end;
// 判斷線段相交
function Intersect(const L1, L2 :TLineSegment) :Boolean;
begin
Result :=( (max(L1.pt1.x,L1.pt2.x)>= min(L2.pt1.x,L2.pt2.x)) and
(max(L2.pt1.x, L2.pt2.x) >= min(L1.pt1.x, L1.pt2.x)) and
(max(L1.pt1.y, L1.pt2.y) >= min(L2.pt1.y, L2.pt2.y)) and
(max(L2.pt1.y, L2.pt2.y) >= min(L1.pt1.y, L1.pt2.y)) and
(Multiply(L2.pt1, L1.pt2, L1.pt1) * Multiply(L1.pt2, L2.pt2, L1.pt1) >= 0) and
(Multiply(L1.pt1, L2.pt2, L2.pt1) * Multiply(L2.pt2, L1.pt2, L2.pt1) >= 0));
end;
function IndexOfPolygon(const APoint: TPointX;const AreaInfoList :TPolygonInfoList): Boolean;
begin
Flag := InPolygon(AreaInfoList,; APoint) :Integer;
if Flag<=1 then
begin
Result :=True;
Exit;
end;
end;
uj5u.com熱心網友回復:
1、折線圖都由作業表的x,y列陣而來。2、由原點(x1,y1)的x1值,在作業表的列陣中,找到該點垂直線與折線交點,對應作業表中左邊最近的點(xl,y|)和右邊最近的點(xR,yR)。
3、由上述兩個點,得出該折線的中點(x0,y0)值。
4、y1>y0點在折線上方,y1=y0點在折線上,y1<y0點在折線的下方。
沒看太明白
uj5u.com熱心網友回復:
先取點到折線陣列最近距離的那條線段,再用向量叉積判斷一下就出來了uj5u.com熱心網友回復:
先取點到折線陣列最近距離的那條線段,再用向量叉積判斷一下就出來了是求點到直線的垂直距離嗎?
uj5u.com熱心網友回復:
如果線條不是閉合的結果不嚴謹,只能大致那樣判斷了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/78893.html
上一篇:求解,如圖
