• <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| 久久国产精品99精品国产| 国产午夜精品久久久久九九电影| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久久久亚洲av无码专区| 狠狠88综合久久久久综合网| 亚洲&#228;v永久无码精品天堂久久 | 国产欧美久久一区二区| 综合久久给合久久狠狠狠97色| 久久99热精品| 亚洲午夜精品久久久久久浪潮| 久久国产精品成人影院| 久久中文字幕无码专区| 久久国产成人亚洲精品影院| 久久国语露脸国产精品电影| 亚洲国产一成久久精品国产成人综合 | 久久精品国产日本波多野结衣| 久久精品国产秦先生| 99久久精品国产一区二区| 久久天天躁狠狠躁夜夜躁2014| 欧美综合天天夜夜久久| 91亚洲国产成人久久精品| 国内精品久久久久久久影视麻豆 | 狼狼综合久久久久综合网| 九九久久自然熟的香蕉图片| 亚洲精品tv久久久久久久久久| 91麻豆精品国产91久久久久久 | 99久久国产热无码精品免费久久久久| 少妇人妻综合久久中文字幕| 亚洲色婷婷综合久久| 亚洲精品乱码久久久久久不卡| 久久激情亚洲精品无码?V| 伊人色综合九久久天天蜜桃| 精品久久人人妻人人做精品| 久久久久久a亚洲欧洲aⅴ | 久久久久人妻一区二区三区| 久久免费香蕉视频| 日韩AV毛片精品久久久| 亚洲欧美国产日韩综合久久 | 欧美久久天天综合香蕉伊|