題目鏈接:http://acm.timus.ru/problem.aspx?space=1num=1348 題目的意思是:求一個點到線段的最短距離和最長距離。 最長距離比較容易,就是求點到線段兩個端點較長的那個距離就是ans。 最短距離就比較有意思了。。 可能的情況就是點到線段的垂線的垂足
題目鏈接:http://acm.timus.ru/problem.aspx?space=1&num=1348
題目的意思是:求一個點到線段的最短距離和最長距離。
最長距離比較容易,就是求點到線段兩個端點較長的那個距離就是ans。
最短距離就比較有意思了。。
可能的情況就是點到線段的垂線的垂足在線段內(nèi),還有就是垂足在線段外。。
在線段內(nèi)的話,那么應用叉積求面積+底面長度可以求得垂線長度也就是最短距離。
如果在線段外的話,最短距離就是點到線段的兩個端點的最小值。
那么問題就來了。怎么判斷垂足在線段內(nèi)還是在線段外的呢??
詳細見代碼。 - - 。。
Code:
#include#include #include #include #include using namespace std; const double eps = 1e-8; const double pi = acos(-1); //點 struct POINT { double x, y; POINT(){ } POINT(double a, double b){ x = a; y = b; } }; //線段 struct Seg { POINT a, b; Seg() { } Seg(POINT x, POINT y){ a = x; b = y; } }; //直線 struct Line { POINT a, b; Line() {} Line(POINT x, POINT y){ a = x; b = y; } }; //叉乘 double cross(POINT o, POINT a, POINT b) { return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y); } //求兩點間的距離 double dis(POINT a, POINT b) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); } Seg s; POINT p; double L; //點到直線的距離.. double PointToLine(POINT p, Line l) { return fabs(cross(p, l.a, l.b)) / dis(l.a, l.b); } //線段到直線的距離.. double PointToSeg(POINT p, Seg s) { POINT tmp = p; tmp.x += s.a.y - s.b.y; tmp.y += s.b.x - s.a.x; if(cross(s.a, p, tmp) * cross(s.b, p, tmp) >= 0){ return min(dis(p, s.a), dis(p, s.b)); } return PointToLine(p, Line(s.a, s.b)); } void solve() { double ans1 = PointToSeg(p, s), ans2 = max(dis(p, s.a), dis(p, s.b)); printf("%.2lf\n%.2lf\n", ans1 > L ? ans1 - L : 0, ans2 > L ? ans2 - L : 0); return ; } int main() { // freopen("11.txt", "r", stdin); while(~scanf("%lf %lf %lf %lf", &s.a.x, &s.a.y, &s.b.x, &s.b.y)){ scanf("%lf %lf %lf", &p.x, &p.y, &L); solve(); } return 0; }
好吧,還需要好好的學習。。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com