青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-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 老馬驛站 閱讀(727) 評論(0)  編輯 收藏 引用 所屬分類: c++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品久久| 欧美黄色一区| 欧美顶级艳妇交换群宴| 亚洲黄一区二区三区| 欧美高潮视频| 中日韩高清电影网| 欧美诱惑福利视频| 黄色成人片子| 欧美va天堂| 一区二区免费在线观看| 久久精品国产亚洲一区二区三区 | 欧美jjzz| 亚洲视频欧美视频| 开心色5月久久精品| 99在线|亚洲一区二区| 国产精品一级二级三级| 久久精品一区| 一区二区欧美激情| 免费欧美电影| 亚洲一区久久久| 今天的高清视频免费播放成人 | 久久亚洲免费| 亚洲精品乱码久久久久久日本蜜臀| 欧美精品一区二| 欧美一区二区视频在线| 亚洲国产精品成人| 欧美在线观看网址综合| 亚洲三级网站| 国产亚洲欧美aaaa| 欧美激情精品久久久六区热门| 亚洲欧美日韩综合国产aⅴ| 欧美激情aⅴ一区二区三区| 亚洲综合色自拍一区| 亚洲成人资源| 国产麻豆午夜三级精品| 欧美精品一区二区蜜臀亚洲| 欧美一进一出视频| 99国内精品久久久久久久软件| 久久综合狠狠综合久久综合88| 中文日韩欧美| 亚洲精品久久久久久一区二区| 国产香蕉97碰碰久久人人| 欧美另类高清视频在线| 久久久99国产精品免费| 亚洲欧美精品一区| 日韩视频二区| 亚洲国产第一页| 每日更新成人在线视频| 欧美一区二区三区四区在线观看| 亚洲剧情一区二区| 一区二区在线看| 国产亚洲人成网站在线观看 | 国产精品日日做人人爱| 欧美精品在线极品| 久久综合九色综合欧美就去吻| 亚洲免费在线视频| 亚洲天堂男人| 99re在线精品| 最近中文字幕日韩精品| 噜噜噜久久亚洲精品国产品小说| 久久国产精品毛片| 香蕉久久国产| 欧美在线观看视频| 午夜宅男欧美| 欧美一区免费视频| 小黄鸭精品aⅴ导航网站入口| 亚洲精品日本| 日韩亚洲视频在线| 9i看片成人免费高清| 亚洲美女中出| 99视频+国产日韩欧美| 亚洲韩日在线| 亚洲精品一区在线观看| 亚洲精品色图| 夜夜嗨一区二区| av成人国产| 亚洲一区二区四区| 亚洲欧美日韩另类精品一区二区三区| 亚洲午夜视频| 欧美一区二区视频在线| 久久福利毛片| 可以看av的网站久久看| 欧美 日韩 国产一区二区在线视频| 蜜臀va亚洲va欧美va天堂| 欧美电影电视剧在线观看| 欧美黄色一级视频| 亚洲日本中文字幕免费在线不卡| 亚洲欧洲日产国产网站| 日韩视频免费在线| 亚洲一区二区成人| 性xx色xx综合久久久xx| 久久国产精品99国产精| 欧美va天堂在线| 国产精品国产自产拍高清av| 国产一区二区久久精品| 亚洲国产一区在线观看| 亚洲桃花岛网站| 久久精品国产清自在天天线| 欧美大片在线看| 一区二区欧美国产| 久久精品五月| 欧美日韩成人网| 国产有码一区二区| 日韩亚洲欧美综合| 欧美专区在线观看一区| 欧美激情第五页| 亚洲午夜久久久久久尤物| 久久婷婷久久| 国产精品播放| 亚洲国产日韩欧美在线99| 亚洲永久免费| 亚洲第一福利社区| 亚洲一区二区伦理| 欧美成人免费观看| 国产日韩在线播放| 99精品欧美一区二区三区综合在线 | 欧美一区午夜精品| 亚洲高清免费在线| 香蕉久久夜色精品| 欧美日韩亚洲国产一区| 伊人成人在线视频| 性欧美超级视频| 亚洲激情在线观看| 久久黄色网页| 欧美性猛交一区二区三区精品| 亚洲国产成人久久综合一区| 午夜一区不卡| 日韩视频在线一区二区| 美女主播一区| 国产一二三精品| 亚洲一区二区三区三| 亚洲高清资源| 久久久亚洲影院你懂的| 国产欧美综合一区二区三区| 99视频在线精品国自产拍免费观看| 久久免费视频在线观看| 亚洲综合日韩中文字幕v在线| 欧美激情四色| 91久久精品一区二区三区| 久久久午夜视频| 亚洲综合第一页| 国产精品国产三级国产普通话蜜臀| 亚洲人成毛片在线播放| 欧美mv日韩mv国产网站| 久久超碰97人人做人人爱| 国产欧美日韩亚洲| 欧美一区二区三区视频| 99re66热这里只有精品3直播| 欧美精品激情在线观看| 亚洲黄色成人久久久| 欧美va亚洲va国产综合| 久久精品国产一区二区三| 国产亚洲欧美一区二区三区| 欧美有码在线视频| 午夜精品成人在线| 国产欧美一区二区精品秋霞影院| 亚洲综合日本| 亚洲无人区一区| 国产精品久久久久久久久婷婷| 在线亚洲激情| 一本色道久久综合狠狠躁的推荐| 欧美日韩1区2区3区| 一本久久青青| 亚洲伦理在线观看| 欧美日韩理论| 亚洲午夜女主播在线直播| 一区二区三区国产在线| 欧美日韩中国免费专区在线看| 亚洲图片欧美一区| 在线亚洲免费| 国产片一区二区| 久久久久久亚洲综合影院红桃| 久久gogo国模裸体人体| 在线播放不卡| 亚洲福利视频二区| 欧美乱在线观看| 亚洲手机视频| 午夜在线a亚洲v天堂网2018| 国产日韩在线播放| 免费在线看成人av| 男人的天堂亚洲在线| 99国产精品| 亚洲午夜一区二区| 国内外成人在线| 欧美成人免费在线| 欧美日韩123| 欧美一级视频免费在线观看| 久久精品99国产精品| 亚洲国产婷婷香蕉久久久久久| 亚洲国产乱码最新视频| 欧美日韩综合在线免费观看| 亚洲欧美日韩在线| 久久色中文字幕| 一区二区三区av| 亚洲专区国产精品| 亚洲国产精品一区二区三区| 亚洲精品欧美精品| 国产亚洲一区二区在线观看| 欧美黄色免费| 国产精品视频精品|