码迷,mamicode.com
首页 > 其他好文 > 详细

简单的计算几何

时间:2015-12-28 12:17:47      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>

using namespace std;
//=========================================================================
struct V{
    double px,py;
    V operator - (const V c){
        V a;
        a.px = px - c.px,a.py = py - c.py;
        return a;
    }
    bool operator <= (const V c){
        return px <= c.px && py <= c.py;
    }
    bool min(V a,V b){
        if(b <= a) swap(a,b);
        return a <= *this;
    }
    bool max(V a,V b){
        if(a <= b) swap(a,b);
        return *this <= a;
    }
    double CP(V c){
        return px*c.py - py*c.px;
    }
    double DP(V c){
        return px*c.px + py*c.py;
    }
};//vector

struct L{
    V p1,p2;
    bool p0;//p0? beeline : segment
    int pa;
/*
    switch(pa){
    case 1: parallel-x;
    case 2: parallel-y;
    default: k < oo && k != 0;
    }
*/
    double k;
    void getk(){
        if(p1.px == p2.px) pa = 1;
        else if(p1.py == p2.py) pa = 2;
        else pa = 0,k = (p1.py-p2.py) / (p1.px-p2.px);
    }
    bool IP(V q){
        return q.min(p1,p2) && q.max(p1,p2);
    }//in the ploygon of the line
    bool CR(L c){
        V v1 = p2 - p1,v2 = c.p1 - p1,v3 = c.p2 - p1;
        if(v1.CP(v2) * v1.CP(v3) < 0) return true;
        else{
            if(v2.DP(v3) <= 0) return true;
            else return false;
        }
    }//line cross
};//line

struct BL{
};//broken line

struct PL{
};//ploygon

//=========================================================================
double CP(V a,V b){
    return a.px*b.py - a.py*b.px;
}//cross product

double DP(V a,V b){
    return a.px*b.px + a.py*b.py;
}//dot product

double DIS(V a,V b){
    return sqrt((a.px-b.px)*(a.px-b.px) + (a.py-b.py)*(a.py-b.py));
}//disdance

//=========================================================================
bool POL(V q,L p){
    /*double x1 = p.p1.px,x2 = p.p2.px,y1 = p.p1.py,y2 = p.p2.py,
        x0 = q.px,y0 = q.py;
    if((!p.p0) && (!(x0 <= max(x1,x2) && x0 >= min (x1,x2) && y0 <= max(y1,y2) && y0 >= min(y1,y2))))
      return false;*/
    //if((!p.p0) && (!(q.min(p.p1,p.p2) && q.max(p.p1,p.p2)))) return false;
    if((!p.p0) && (!p.IP(q))) return false;
    if(!CP(q-p.p1,p.p2-p.p1)) return true;
    else return false;
}//wheather a point is on a line

bool SCR(L a,L b){
    return a.CR(b) && b.CR(a);
}

//=========================================================================
int main(){
}

已解决问题:

判断点是否在线段上

判断两线段是否相交

 

(这是草稿,未完待续~)

简单的计算几何

标签:

原文地址:http://www.cnblogs.com/woodenhead/p/5081861.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!