设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 182|回复: 4

集合-向量

[复制链接]
  • TA的每日心情
    开心
    2021-6-19 14:40
  • 签到天数: 1539 天

    [LV.Master]伴坛终老

    发表于 2021-1-30 11:53 | 显示全部楼层 |阅读模式
    计算几何基础

    struct Point
    {
        double x,y;
        Point(double x=0,double y=0):x(x),y(y) {}
    };
    typedef Point Vector;
    Vector operator + (Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); }
    Vector operator - (Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); }
    Vector operator * (Vector A,double p) { return Vector(A.x*p,A.y*p); }
    Vector operator / (Vector A,double p) { return Vector(A.x/p,A.y/p); }

    bool operator < (const Point& a,const Point& b)
    {
        return a.x<b.x || (a.x==b.x && a.y<b.y);
    }
    int dcmp(double x)  //
    {
        if(fabs(x)<esp) return 0;
        else return x<0?-1:1;
    }
    bool operator == (const Point& a,const Point& b)
    {
        return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y)==0;
    }

    首先在二维坐标下介绍一些定义:
    点:A(x1,y1),B(x2,y2)

    向量:向量AB=( x2 - x1 , y2 - y1 )= ( x ,  y );

    向量的模 |AB| = sqrt ( x*x+y*y );


    向量的点积: 结果为 x1*x2 + y1*y2。

    点积的结果是一个数值。

    点积的集合意义:我们以向量 a 向向量 b 做垂线,则 | a | * cos(a,b)为 a 在向量 b 上的投影,即点积是一个向量在另一个向量上的投影乘以另一个向量。且满足交换律

    应用:可以根据集合意义求两向量的夹角,cos(a,b) =( 向量a * 向量b ) / (| a | * | b |) =  x1*x2 + y1*y2 / (| a | * | b |)



    向量的叉积: 结果为 x1*y2-x2*y1

    叉积的结果也是一个向量,是垂直于向量a,b所形成的平面,如果看成三维坐标的话是在 z 轴上,上面结果是它的模。

    方向判定:右手定则,(右手半握,大拇指垂直向上,四指右向量a握向b,大拇指的方向就是叉积的方向)

    叉积的集合意义:1:其结果是a和b为相邻边形成平行四边形的面积。

    2:结果有正有负,有sin(a,b)可知和其夹角有关,夹角大于180°为负值。

    3:叉积不满足交换律

    应用:

    1:通过结果的正负判断两矢量之间的顺逆时针关系

    若 a x b > 0表示a在b的顺时针方向上

    若 a x b < 0表示a在b的逆时针方向上
    若 a x b == 0表示a在b共线,但不确定方向是否相同

    2:判断折线拐向,可转化为判断第三点在前两的形成直线的顺逆时针方向,然后判断拐向。

    3:判断一个点在一条直线的那一侧,同样上面的方法。

    4:判断点是否在线段上,可利用叉乘首先判断是否共线,然后在判断是否在其上。

    5:判断两条直线是否想交(跨立实验)

    根据判断点在直线那一侧我们可以判断一个线段的上的两点分别在另一个线段的两侧,当然这是不够的,因为我们画图发现这样只能够让直线想交,而不是线段,所以我们还要对另一条线段也进行相同的判断就ok。


    代码:

    ///计算点积,及向量长度,及向量夹角
    double Dot(Vector A,Vector B) { return A.x*B.x+A.y*B.y; }
    double Length(Vector A) { return sqrt(Dot(A,A)); }
    double Angle(Vector A,Vector B) { return acos(Dot(A,B))/Length(A)/Length(B); }
    //计算叉积,向量逆时针旋转,两线段是否想交
    double Cross(Vector A,Vector B) { return (A.x*B.y-A.y*B.x); }
    double Area2(Vector A,Vector B,Vector C)  { return Cross(B-A,C-A); }
    Vector Rotate(Vector A,double rad)
    {
        return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));
    }
    bool Converxline(Vector A,Vector B,Vector C,Vector D)
    {
        //共线或平行
        if((Area2(A,B,C)==0&&Area2(A,B,D)==0) || Area2(A,B,C)*Area2(A,B,D)>0||Area2(C,D,A)*Area2(C,D,B)>0)
            return false;
        else
            return true;
    }
    回复


    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构工程服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系电话:198-7840-1958,QQ:463017170.
    相关关键词:膜结构车棚,膜结构车棚覆盖,膜结构车棚公司,膜结构车棚多少钱,膜结构车棚厂家,膜结构车棚价格,社区膜结构车棚,膜结构车棚膜布厂家 ,膜结构车棚哪家好,膜结构车棚多少钱一米,膜结构车棚报价,膜结构车棚哪里有,膜结构车棚定制,膜结构车棚安装,膜结构车棚设计,膜结构车棚电话,膜结构车棚加工,膜结构车棚膜布价格,膜结构车棚批发,膜结构车棚制造商,膜结构车棚生产厂家,膜结构车棚设计,膜结构车棚施工,膜结构车棚多少钱一平米,膜结构车棚订制,张拉膜车棚,张拉膜车棚覆盖,张拉膜车棚公司,张拉膜车棚多少钱,张拉膜车棚厂家,张拉膜车棚价格,社区张拉膜车棚,张拉膜车棚膜布厂家 ,张拉膜车棚哪家好,张拉膜车棚多少钱一米,张拉膜车棚报价,张拉膜车棚哪里有,张拉膜车棚定制,张拉膜车棚安装,张拉膜车棚设计,张拉膜车棚电话,张拉膜车棚加工,张拉膜车棚膜布价格,张拉膜车棚批发,张拉膜车棚制造商,张拉膜车棚生产厂家,张拉膜车棚设计,张拉膜车棚施工,张拉膜车棚多少钱一平米,张拉膜车棚订制,常用膜材品牌:德国杜肯、法国法拉利、德国海德斯、德国米乐、日本平岗、韩国秀博、比利时希运、美国赫虏伯、中国科宝、上海慧遥。

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-19 14:40
  • 签到天数: 1539 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-1-30 11:54 | 显示全部楼层
    /*在两条直线相交时,求相交点
    方法1:可以直线方程来求解,但是效率低下,而且程序繁琐。
    方法2:使用叉积公式求交点,即高效又简便。
      介绍方法2:
        设mul(p1,p2,p0)为p1p0与p0p1的叉积,即mul(p1,p2,p0)=(p1-p0)^(p2-p0)。
        该叉积可以看做由点p0,p1,p2和p1+p2四个点围成的平行四边形的阴影面积,
      即三角形p1p2p0面积s(p1p2p0)=mul(p1,p2,p0)/2;
        四边形ABCD,线段AB与CD交于点P。从D点出发引一条AB的垂线DD',从C点出发引一条AB的垂线CC',
      由于三角形DD'P与三角形CC'P相似,因此|DD'|/|CC'|=|DP|/|PC|;由因为S(ABD)=(DD'*AB)/2,
      S(ABC)=(CC'*AB)/2;
      ==>|DP|/|PC|=S(ABD)/S(ABC)=|AD*AB|/|AC*AB|=|mul(D,B,A)|/|mul(C,B,A)|
      又因为|DP|/|PC|=(x(D)-x(P))/(x(P)-x(C))=(y(D)-y(P))/(y(P)-y(C));
      x(p)=(S(ABD)*x(C)+S(ABC)*x(D))/(S(ABD)+S(ABC))
          =(mul(D,B,A)*x(C)-mul(C,B,A)*x(D))/mul(D,C,A)-mul(C,B,A);
      x(p)=(S(ABD)*y(C)+S(ABC)*y(D))/(S(ABD)+S(ABC))
          =(mul(D,B,A)*y(C)-mul(C,B,A)*y(D))/mul(D,C,A)-mul(C,B,A);
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-19 14:40
  • 签到天数: 1539 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-1-30 11:55 | 显示全部楼层
    /* poj 1269
    例子:
    Sample Input
    5
    0 0 4 4 0 4 4 0
    5 0 7 6 1 0 2 3
    5 0 7 6 3 -6 4 -3
    2 0 2 27 1 5 18 5
    0 3 4 0 1 2 2 5
    Sample Output
    INTERSECTING LINES OUTPUT
    POINT 2.00 2.00
    NONE
    LINE
    POINT 2.00 5.00
    POINT 1.07 2.20
    END OF OUTPUT
    解题思路:
    计算a1=mul(p1,p2,p3) a2=mul(p1,p2,p4);
    若a1==0&&a2==0,则重叠
    若a1与a2同号,两者平行
    若a1与a2异号,相交
    p=((a2*p3.x-a1*p4.x)/(a2-a1),(a2*p3.y-a1*p4.y)/(a2-a1));
    */
    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const double epsi=1e-10;
    struct Point
    {
            double x,y;
            Point(double _x=0,double _y=0):x(_x),y(_y){}
            Point operator -(const Point &op) const
            {
                    return Point(x-op.x,y-op.y);
            }
            double operator ^(const Point &op) const
            {
                    return x*op.y-y*op.x;
            }
    };
    inline int sign(const double &x)
    {
            if(x>epsi) return 1;
            if(x<-epsi) return -1;
            return 0;
    }
    inline double sqr( const double &x)
    {
            return x*x;
    }
    inline double dis(const Point &p1,const Point &p2)
    {
            return sqrt(sqr(p1.x-p2.x)+sqr(p1.y-p2.y));
    }
    inline double mul(const Point &p0,const Point &p1,const Point &p2)
    {
            return (p1-p0)^(p2-p0);
    }
    inline int cross(const Point &p1,const Point &p2,const Point &p3,const Point &p4,Point &p)
    {
            double a1=mul(p1,p2,p3),a2=mul(p1,p2,p4);
            if(sign(a1)==0&&sign(a2)==0) return 2;//重叠
            if(sign(a1-a2)==0) return 0;//平行
            p.x=(a2*p3.x-a1*p4.x)/(a2-a1);
            p.y=(a2*p3.y-a1*p4.y)/(a2-a1);
            return 1;//相交
    }
    Point p1,p2,p3,p4,p;
    int main()
    {
            int test=0;
            printf("INTERSECTING LINES OUTPUT\n");
            scanf("%d",&test);
            while(test--)
            {
                    scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y,&p3.x,&p3.y,&p4.x,&p4.y);
                    int fm=cross(p1,p2,p3,p4,p);
                    if(fm==0) printf("NONE\n");
            else if(fm==2) printf("LINE\n");
                    else printf("POINT %.2lf %.2lf\n",p.x,p.y);
            }
            printf("END OF OUTPUT\n");
            return 0;
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-19 14:40
  • 签到天数: 1539 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-1-30 11:56 | 显示全部楼层
    double multiply(point sp, point ep, point op) //得到线段(sp-op)和线段(ep-op)的叉积
    {
            return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));
    }

    bool intersect(line u, line v)   //判断线段u和线段v是否相交
    {
            return( (max(u.s.x,u.e.x)>=min(v.s.x,v.e.x))&&                     //排斥实验
                    (max(v.s.x,v.e.x)>=min(u.s.x,u.e.x))&&
                    (max(u.s.y,u.e.y)>=min(v.s.y,v.e.y))&&
                    (max(v.s.y,v.e.y)>=min(u.s.y,u.e.y))&&
                    (multiply(v.s,u.e,u.s)*multiply(u.e,v.e,u.s)>=0)&&         //跨立实验
                    (multiply(u.s,v.e,v.s)*multiply(v.e,u.e,v.s)>=0));
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-19 14:40
  • 签到天数: 1539 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-1-30 11:59 | 显示全部楼层

    bool quick(double x1,double  y1,double x2,double y2,double x3,double y3,double x4,double y4)
    {
        if(min(x1,x2)>max(x3,x4)) return false;
        if(max(x1,x2)<min(x3,x4)) return false;
        if(min(y1,y2)>max(y3,y4)) return false;
        if(max(y1,y2)<min(y3,y4)) return false;
        return true;
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐膜材品牌上一条 /6 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构

    QQ|申请友链|手机版|中国膜结构论坛