设为首页收藏本站

中国膜结构网

 找回密码
 立即注册
膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 35|回复: 2

三点画弧

[复制链接]
  • TA的每日心情
    开心
    2021-3-7 10:01
  • 签到天数: 1440 天

    连续签到: 19 天

    [LV.10]以坛为家III

    发表于 2021-2-14 22:23 | 显示全部楼层 |阅读模式
    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构咨询服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系QQ:463017170.
    AcGePoint2d pt1 pt2 pt3;
    AcGePoint2d center.

    Lets find the center point of the Arc:

    double yDeltaA = pt2.y - pt1.y;

    double xDeltaA = pt2.x - pt1.x;

    double yDeltaB = pt3.y - pt2.y;

    double xDeltaB = pt3.x - pt2.x;

    //case for vertical or horizontal

    if (fabs(xDeltaA) <= fuzz && fabs(yDeltaB) <= fuzz){

    center.x = (pt2.x + pt3.x)/2.0;

    center.y = (pt1.y + pt2.y)/2.0;

    } else {

    double aSlope=yDeltaA/xDeltaA;

    double bSlope=yDeltaB/xDeltaB;

    // checking whether the given points are colinear.

    if (fabs(aSlope-bSlope) <= fuzz) return false;

    center.x = (aSlope*bSlope*(pt1.y - pt3.y) + bSlope*(pt1.x + pt2.x)

    - aSlope*(pt2.x+pt3.x))/(2* (bSlope-aSlope));

    center.y = -1*(center.x - (pt1.x+pt2.x)/2.0)/aSlope+(pt1.y+pt2.y)/2.0;

    }

    Now to calculate the bulge we need the included angle.
    The bulge is calculates as tan(includedAngle/4.0);

    So get the Angles:
    double startang = acutAngle(asPtn2d(center), asPtn2d(pt1));

    double endang = acutAngle(asPtn2d(center), asPtn2d(pt3));

    We now need to know the clock but there are 2 posibilities!
    Your function is fine here but change it to accept to a AcGePoint2d

    clock1 = cwisept (pt1, pt2, pt3);
    clock2 = cwisept (pt1, center, pt3);

    The diff_angle function normalises the angle
    if (clock1 == clock2) {

    includedAngle = 2.0*_PI-diff_angle(startang, endang);

    } else {

    includedAngle = diff_angle(endang, startang);

    }

    double bulge = tan(includedAngle/4.0);

    That it!

    So to make it!
    AcDbPolyline *plx = new AcDbPolyline;

    plx->addVertexAt(0, pt1, bulge);

    plx->addVertexAt(1, pt3, 0.0);

    now Append the entity to the database and you are done!



    Regards Gary.

    www.drcauto.com

    #define ANG360 (2.0*_PI)

    double diff_angle(double a1x, double a2x )

    {

    double delta;

    double a1, a2;

    a1 = fmod(a1x, ANG360);

    a2 = fmod(a2x, ANG360);

    if(fabs(a1) > _PI ) {

    if( a1 < 0.0 )

    a1 += ANG360;

    else

    a1 -= ANG360;

    }

    if (fabs(a2) > _PI) {

    if( a2 < 0.0 )

    a2 += ANG360;

    else

    a2 -= ANG360;

    }

    delta = a1 - a2;

    if(delta > ANG360) {

    delta = fmod(delta, ANG360);

    }

    if(fabs(delta) > _PI) {

    if(delta < 0.0 )

    delta += ANG360;

    else

    delta -= ANG360;

    }

    return delta;

    }
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-3-7 10:01
  • 签到天数: 1440 天

    连续签到: 19 天

    [LV.10]以坛为家III

     楼主| 发表于 2021-2-14 22:23 | 显示全部楼层
    static bool ptarc (ads_point St, ads_point Mid, ads_point End, ads_point& RetVal)
            {
                    if (acutAngle(St,Mid) == acutAngle(St,End)){
                            return (false);
                    }
                    ads_real Ang, Dist;
                    ads_real Pi = 3.14159265358979;
                    ads_point Tmp1, Tmp2;
                    Ang = acutAngle(St,Mid);
                    Dist = acutDistance(St,Mid);
                    Dist = Dist / 2;
                    acutPolar(St,Ang,Dist,Mid);
                    Ang = acutAngle(St,End);
                    Dist = acutDistance(St,End);
                    Dist = Dist / 2;
                    acutPolar(St,Ang,Dist,End);
                    Ang = acutAngle(St,Mid);
                    Ang = Ang + (Pi / 2.0);
                    acutPolar(Mid,Ang,1,Tmp1);
                    Ang = acutAngle(St,End);
                    Ang = Ang + (Pi / 2.0);
                    acutPolar(End,Ang,1,Tmp2);
                    acdbInters(Mid, Tmp1, End, Tmp2, 0, RetVal);
                    return (true);
            }

    static bool cwisept (ads_point St,ads_point Mid, ads_point End) {
                    if ((((Mid[X] - St[X]) * (End[Y] - Mid[Y])) - ((Mid[Y] - St[Y]) * (End[X] - Mid[X]))) < 0) {
                            //acutPrintf("\nPoints Clockwise     ");
                            return (true);
                    } else {
                            //acutPrintf("\nPoints Anti-Clockwise");
                            return (false);
                    }
    }

    static double BulgePts (ads_point St, ads_point Mid, ads_point End)
            {
                    ads_point Cen,MidPt;
                    double Radius,MidLen,Angle,Len;
                    ptarc(St,Mid,End,Cen);
                    Radius = acutDistance(St,Cen);
                    MidLen = acutDistance(St,End);
                    Angle = acutAngle(St,End);
                    acutPolar(St,Angle,MidLen,MidPt);
                    if (acutDistance(Mid,MidPt) > acutDistance(Cen,Mid)){
                            Len = Radius + acutDistance(Cen,MidPt);
                    } else {
                            Len = Radius - acutDistance(Cen,MidPt);
                    }
                    Len = Len / MidLen;
                    if (cwisept(St,Mid,End) == true){
                            Len = Len * -1;
                    }
                    return (Len);
            }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-3-7 10:01
  • 签到天数: 1440 天

    连续签到: 19 天

    [LV.10]以坛为家III

     楼主| 发表于 2021-2-14 22:24 | 显示全部楼层
    #include "tchar.h"
    static bool cwisept (ads_point St,ads_point Mid, ads_point End) {
                    if ((((Mid[X] - St[X]) * (End[Y] - Mid[Y])) - ((Mid[Y] - St[Y]) * (End[X] - Mid[X]))) < 0) {
                            //acutPrintf("\nPoints Clockwise     ");
                            return (true);
                    } else {
                            //acutPrintf("\nPoints Anti-Clockwise");
                            return (false);
                    }
    }

    static bool cross (ads_point Pt,ads_point St, ads_point End){
                    ads_point Tmp;
                   
                    if (Pt[X] > St[X] && Pt[X] > End[X]){
                            //acutPrintf(_T("\nPoint lies to right of Edge."));
                            return false;
                    }
                    if (Pt[Y] > St[Y] && Pt[Y] > End[Y]){
                            //acutPrintf(_T("\nPoint lies above Edge."));
                            return false;
                    }
                    if (Pt[Y] < St[Y] && Pt[Y] < End[Y]){
                            //acutPrintf(_T("\nPoint lies below Edge."));
                            return false;
                    }
                    acutPolar(Pt,0.0,1.0,Tmp);
                    if (acdbInters(Pt,Tmp,St,End,0,Tmp) == RTNORM) {
                            if (Pt[X] > Tmp[X]){
                                    //acutPrintf(_T("\nPoint Does Not Cross Edge."));
                                    return false;
                            } else {
                                    //acutPrintf(_T("\nPoint Crosses Edge."));
                                    return true;
                            }
                    }
                    if (Pt[Y] == St[Y] && Pt[Y] == End[Y]){
                            //acutPrintf(_T("\nPoint lies along edge."));
                    }
                    return false;
            }
    static bool cwisepts (ads_point Pts[], int Size) {
                    int Pos = 0;
                    int i;
                    //acutPrintf("\nArray Size = %d",Size);
                    for (i = 0;i < (Size -2);i++) {
                            //acutPrintf("\nChecking Point %d",i);
                            if (cwisept(Pts[i],Pts[i+1],Pts[i+2]) == true) {
                                    Pos = Pos + 1;
                            } else {
                                    Pos = Pos - 1;
                            }
                    }
                    if (cwisept(Pts[Size-2],Pts[Size-1],Pts[0]) == true) {
                            Pos = Pos + 1;
                    } else {
                            Pos = Pos - 1;
                    }
                    if (cwisept(Pts[Size-1],Pts[0],Pts[1]) == true) {
                            Pos = Pos + 1;
                    } else {
                            Pos = Pos - 1;
                    }
                    if (Pos < 0) {
                            return false;
                    } else {
                            return true;
                    }
            }

    static double acutPerp (double Ang){
            double Pi = 3.14159265358979;
            Ang = Ang + (Pi / 2.0);
            return (Ang);
    }

            static bool ptarc (ads_point St, ads_point Mid, ads_point End, ads_point& RetVal)
            {
                    if (acutAngle(St,Mid) == acutAngle(St,End)){
                            return (false);
                    }
                    ads_real Ang, Dist;
                    ads_real Pi = 3.14159265358979;
                    ads_point Tmp1, Tmp2, Mid1, Mid2;
                    Ang = acutAngle(St,End);
                    Dist = acutDistance(St,End);
                    Dist = Dist / 2.0;
                    acutPolar(St,Ang,Dist,Mid1);
                    Ang = Ang + (Pi / 2.0);
                    acutPolar(Mid1,Ang,1.0,Tmp1);
                    Ang = acutAngle(St,Mid);
                    Dist = acutDistance(St,Mid);
                    Dist = Dist / 2.0;
                    acutPolar(St,Ang,Dist,Mid2);
                    Ang = Ang + (Pi / 2.0);
                    acutPolar(Mid2,Ang,1.0,Tmp2);
                    acdbInters(Mid1, Tmp1, Mid2, Tmp2, 0, RetVal);
                    return (true);
            }
            static void CentrePt (ads_point St,ads_point End,double Bulge,ads_point& RetVal)
            {
                    double Ang,Dist;
                    ads_point Mid;
                    ads_real Pi = 3.14159265358979;
                    Ang = acutAngle(St,End);
                    Dist = acutDistance(St, End);
                    Dist = Dist * 0.5;
                    acutPolar(St,Ang,Dist,Mid);
                    Dist = Dist * Bulge;
                    Ang = Ang + (Pi / 2.0);
                    acutPolar(Mid,Ang,Dist,Mid);
                    acedRetPoint(Mid);
                    ptarc(St,Mid,End,RetVal);
            }

            static double Pi (){
                    return (3.14159265358979);
            }

            static double BulgePts (ads_point St, ads_point Mid, ads_point End)
            {
                    ads_point Cen,MidPt;
                    double Radius,MidLen,Ang,Len, Pi;
                    bool cwPt, cwCen;
                    Pi = 3.14159265358979;
                    Pi = Pi * 2.0;
                    ptarc(St,Mid,End,Cen); //get centre point of arc
                    Radius = acutDistance(St,Cen); //get radius of arc
                    cwPt = cwisept(St,Mid,End); //Get Direction of arc
                    cwCen = cwisept(St,Cen,End); //Get direction of centre point relative to start and end points
                    MidLen = acutDistance(St,End);
                    MidLen = MidLen / 2.0;
                    Radius = acutDistance (Cen,St);
                    Len = MidLen / Radius;
                    Ang = asin(Len);
                    Ang = Ang * 2.0;
                    if (cwPt == cwCen){
                            Ang = (Pi - Ang);
                    }
                    if (cwPt == true){
                            Ang = Ang * -1.0;
                    }
                    Ang = Ang * 0.25;
                    Ang = tan(Ang);
                    return (Ang);
            }

            static int Inside (AcGePoint2d Pt, AcGePoint2dArray Pts, bool &RetVal){
                    ads_point St,Frst,Sec;
                    AcGePoint2d Tmp;
                    int Count,i;
                    div_t Rem;

                    //acutPrintf(_T("\nNumber of Points = %d"),Pts.logicalLength());
                    if (Pts.logicalLength() < 2){
                            return (RTERROR);
                    }
                    St[X] = Pt[0];
                    St[Y] = Pt[1];
                    St[Z] = 0.0;
                    Tmp = Pts.at(Pts.logicalLength()-1);
                    Frst[X] = Tmp[0];
                    Frst[Y] = Tmp[1];
                    Frst[Z] = 0.0;
                    Tmp = Pts.at(0);
                    Sec[X] = Tmp[0];
                    Sec[Y] = Tmp[1];
                    Sec[Z] = 0.0;
                    if (cross(St,Frst,Sec) == true){
                            Count = 1;
                    } else {
                            Count = 0;
                    }
                    for (i = 1;i < Pts.logicalLength();i++){
                            Frst[X] = Sec[X];
                            Frst[Y] = Sec[Y];
                            Tmp = Pts.at(i);
                            Sec[X] = Tmp[0];
                            Sec[Y] = Tmp[1];
                            if (cross(St,Frst,Sec) == true){
                                    Count = Count + 1;
                            }
                    }
                    Rem = div(Count,2);
                    if (Rem.rem  == 1){
                            RetVal = true;
                    } else {
                            RetVal = false;
                    }
                    return (RTNORM);

            }
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

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

    GMT+8, 2021-3-8 02:33 , Processed in 0.156452 second(s), 22 queries .

    Powered by 中国膜结构网->膜材采购->膜结构设计->膜结构安装->膜结构维修

    © 2014-2020 膜结构协会->进口膜材->国产膜材->PVDF膜材->PTFE膜材->ETFE膜材.

    快速回复 返回顶部 返回列表