• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-167  評論-8  文章-0  trackbacks-0
            //從圓弧一些信息得到圓弧上一個特殊的點(計算的是二維圖形的情況)
            Point3d DBOPERATION::GetArcTangencyPoint(Point3d pStartPoint, Point3d pEndPoint,
                                                     Point3d pCenterPoint, 
            double dRadius,
                                                     
            double dStartAngle, double dSweepAngle)
            {
                Point3d pResultPoint;
                pResultPoint.X 
            = 0;
                pResultPoint.Y 
            = 0;
                pResultPoint.Z 
            = 0;

                
            //因為會得到兩個點,哪個點在弧上需要再進行判斷
                double dRx1 = 0;
                
            double dRx2 = 0;
                
            double dRy1 = 0;
                
            double dRy2 = 0;

                
            const double PI = 3.1415926535897932;

                Point3d pMiddlePoint;
                pMiddlePoint.X 
            = (pStartPoint.X + pEndPoint.X) / 2;
                pMiddlePoint.Y 
            = (pStartPoint.Y + pEndPoint.Y) / 2;
                pMiddlePoint.Z 
            = 0.0;

                
            //掃角的角度值
                double dArcSweepAngle = 180 * dSweepAngle / PI;
                
            //中點到圓心的距離
                double ddy = 0;
                
            double ddx = 0;
                
            if (pMiddlePoint.X - pCenterPoint.X >= 0.1e-6)
                {
                    ddx 
            = pMiddlePoint.X - pCenterPoint.X;
                }
                
            if (pMiddlePoint.Y - pCenterPoint.Y >= 0.1e-6)
                {
                    ddx 
            = pMiddlePoint.Y - pCenterPoint.Y;
                }
                
            double dDistance = sqrt(ddx * ddx + ddy * ddy);

                
            if ((fabs(pMiddlePoint.Y - pCenterPoint.Y) < 0.1e-6
                    
            && fabs(pMiddlePoint.X - pCenterPoint.X) < 0.1e-6)
                    
            && (fabs(pStartPoint.X - pEndPoint.X) < 0.1e-6
                    
            || fabs(pStartPoint.Y - pEndPoint.Y) <0.1e-6 ))
                {
                    
            //半圓且斜率=0或者斜率為無窮大的情況
                    if (fabs(pStartPoint.X - pEndPoint.X) < 0.1e-6)
                    {
                        
            //結果的兩個X的值
                        dRx1 = pMiddlePoint.X + (dRadius - dDistance);
                        dRx2 
            = pMiddlePoint.X - (dRadius + dDistance);
                        
            //對應的兩個Y的值
                        dRy1 = pMiddlePoint.Y;
                        dRy2 
            = pMiddlePoint.Y;
                    }
                    
            if (fabs(pStartPoint.Y - pEndPoint.Y) <0.1e-6)
                    {
                        
            //結果的兩個X的值
                        dRx1 = pMiddlePoint.X;
                        dRx2 
            = pMiddlePoint.X;
                        
            //對應的兩個Y的值
                        dRy1 = pMiddlePoint.Y + (dRadius - dDistance);
                        dRy2 
            = pMiddlePoint.Y - (dRadius + dDistance);
                    }
                }
                
            else if (fabs(pMiddlePoint.Y - pCenterPoint.Y) < 0.1e-6
                    
            && fabs(pMiddlePoint.X - pCenterPoint.X) >= 0.1e-6)
                {
                    
            //圓心與端點中心點在水平線上的情況,斜率=0
                    
            //結果的兩個X的值
                    dRx1 = pMiddlePoint.X + (dRadius - dDistance);
                    dRx2 
            = pMiddlePoint.X - (dRadius + dDistance);
                    
            //對應的兩個Y的值
                    dRy1 = pMiddlePoint.Y;
                    dRy2 
            = pMiddlePoint.Y;
                }
                
            else if (fabs(pMiddlePoint.X - pCenterPoint.X) < 0.1e-6
                    
            && fabs(pMiddlePoint.Y - pCenterPoint.Y) >= 0.1e-6)
                {
                    
            //圓心與端點中心點在垂直線上的情況,斜率=無窮大
                    
            //結果的兩個X的值
                    dRx1 = pMiddlePoint.X;
                    dRx2 
            = pMiddlePoint.X;
                    
            //對應的兩個Y的值
                    dRy1 = pMiddlePoint.Y + (dRadius - dDistance);
                    dRy2 
            = pMiddlePoint.Y - (dRadius + dDistance);
                }
                
            else
                {
                    
            //圓弧兩個端點成線的斜率,已經排除了等于0或者無窮大的可能性
                    double dTheKSAE = (pEndPoint.Y - pStartPoint.Y) / (pEndPoint.X - pStartPoint.X);
                    
            //與端點組成的線垂直的線的斜率(0度,180度,360度弧的dk需要特殊處理)
                    double dK = (1 / dTheKSAE) * (-1);

                    
            if (fabs(fabs(dArcSweepAngle) - 360< 0.1e-6)
                    {
                        dK 
            = (pMiddlePoint.Y - pCenterPoint.Y) / (pMiddlePoint.X - pCenterPoint.X);
                    }
                    
            if (fabs(fabs(dArcSweepAngle) - 180< 0.1e-6)
                    {
                        dK 
            = (pStartPoint.Y - pCenterPoint.Y) / (pStartPoint.X - pCenterPoint.X);
                        dK 
            = (1 / dK) * (-1);
                    }
                    
            if (fabs(fabs(dArcSweepAngle) - 0< 0.1e-6)
                    {
                        dK 
            = (pMiddlePoint.Y - pCenterPoint.Y) / (pMiddlePoint.X - pCenterPoint.X);
                    }
                    
            /////////////////////////////////////////////////////////
                    //這是經過兩端點中點并與兩端點組成的直線垂直的直線的方程
                    
            //k為斜率,M(x),M(y)分別為中心點坐標值
                    
            //y=k * x - k * M(x) + M(y)
                    /////////////////////////////////////////////////////////

                    
            //求出- k * M(x) + M(y)部分的值
                    double dDif = (-1* dK * pMiddlePoint.X + pMiddlePoint.Y;

                    
            /////////////////////////////////////////////////////////
                    // [x - C(x)]^2 + [y - C(y)]^2 = r^2
                    
            // 代入上面的y,其中- k * M(x) + M(y)以dDif代替
                    
            // [x - C(x)]^2 + [kx + dDif - C(y)]^2 = r^2
                    
            // 下面以dBetween代替+ dDif - C(y)
                    /////////////////////////////////////////////////////////
                    double dBetween = dDif - pCenterPoint.Y;

                    
            /////////////////////////////////////////////////////////
                    // x^2 + 2*C(x)*x + [C(x)]^2
                    
            // +
                    
            // (kx)^2 + 2*k*dBetween*x + (dBetween)^2
                    
            // = r^2
                    /////////////////////////////////////////////////////////

                    
            //再求中間值
                    double dNx = (2 * dK * dBetween - 2 * pCenterPoint.X) / (1 + dK * dK);
                    
            double dLa = (dRadius * dRadius - pCenterPoint.X * pCenterPoint.X
                        
            - dBetween * dBetween) / (1 + dK * dK);
                    
            double dAd = dLa + dNx * dNx / 4;

                    
            //結果的兩個X的值
                    dRx1 = sqrt(dAd) - dNx / 2;
                    dRx2 
            = (-1* sqrt(dAd) - dNx / 2;
                    
            //對應的兩個Y的值
                    dRy1 = dK * dRx1 - dK * pMiddlePoint.X + pMiddlePoint.Y;
                    dRy2 
            = dK * dRx2 - dK * pMiddlePoint.X + pMiddlePoint.Y;
                }

                
            //對得到的兩個點進行判斷,找到在弧上的那個
                pResultPoint.X = dRx1;
                pResultPoint.Y 
            = dRy1;
                
            if (fabs(fabs(dArcSweepAngle) - 180.0< 0.1e-4)
                {
                    
            //半圓情況處理
                    double p1x,p1y,p2x,p2y,qx,qy,dx1,dy1,dx2,dy2,det;
                    p2x 
            = pStartPoint.X;
                    p2y 
            = pStartPoint.Y;
                    p1x 
            = pCenterPoint.X;
                    p1y 
            = pCenterPoint.Y;
                    qx 
            = dRx2;
                    qy 
            = dRy2;

                    dx1 
            = p2x - p1x;
                    dy1 
            = p2y - p1y;
                    dx2 
            = qx- p2x;
                    dy2 
            = qy - p2y;
                    det 
            = dx1*dy2 - dx2*dy1;
                    BOOL bBlockWise 
            = TRUE;
                    
            if (det > 0.0)
                    {
                        
            //逆時針方向
                        bBlockWise = FALSE;
                    }
                    
            if (((!bBlockWise) && (dArcSweepAngle > 0.0))
                        
            || ((bBlockWise) && (dArcSweepAngle < 0.0)))
                    {
                        pResultPoint.X 
            = dRx2;
                        pResultPoint.Y 
            = dRy2;
                    }
                }
                
            else
                {
                    
            //非半圓的情況
                    double dd1 = sqrt(pow(dRx1 - pMiddlePoint.X, 2)
                        
            + pow(dRy1 - pMiddlePoint.Y, 2));
                    
            double dd2 = sqrt(pow(dRx2 - pMiddlePoint.X, 2)
                        
            + pow(dRy2 - pMiddlePoint.Y, 2));
                    
            if (((dd1 < dd2) && (fabs(dArcSweepAngle) > 180.0))
                        
            || ((dd1 > dd2) && (fabs(dArcSweepAngle) < 180.0)))
                    {
                        pResultPoint.X 
            = dRx2;
                        pResultPoint.Y 
            = dRy2;
                    }
                }

                
            return pResultPoint;
            }
            posted on 2010-09-08 10:12 老馬驛站 閱讀(693) 評論(0)  編輯 收藏 引用 所屬分類: c++
            久久无码AV一区二区三区| 久久偷看各类wc女厕嘘嘘| 午夜天堂精品久久久久| 久久精品无码一区二区三区| 色综合久久久久网| 少妇人妻综合久久中文字幕| 精品国产99久久久久久麻豆| a级成人毛片久久| 久久亚洲高清观看| 欧美国产成人久久精品| 人妻精品久久久久中文字幕69| 天天躁日日躁狠狠久久| 91麻精品国产91久久久久| 久久婷婷五月综合色奶水99啪| 久久久久无码精品国产不卡| 亚洲国产成人久久综合碰| 狠狠色丁香婷婷综合久久来来去| 久久精品夜色噜噜亚洲A∨| 久久精品国产亚洲AV无码偷窥| 久久av高潮av无码av喷吹| 看久久久久久a级毛片| 久久人人爽人人澡人人高潮AV| 久久久久久久久无码精品亚洲日韩 | 性高湖久久久久久久久AAAAA| 久久久噜噜噜www成人网| 国产免费久久久久久无码| 国产叼嘿久久精品久久| 精品久久人妻av中文字幕| 国产人久久人人人人爽| 午夜精品久久久久久| 一级做a爰片久久毛片人呢| 丰满少妇人妻久久久久久| 热re99久久6国产精品免费| 久久久久青草线蕉综合超碰| 2019久久久高清456| 午夜视频久久久久一区 | 国产精品久久久久久久久软件| 国产福利电影一区二区三区久久久久成人精品综合 | 伊人色综合久久天天网 | 国产精品久久久久天天影视| 精品无码久久久久久午夜|