1. 程式人生 > >任意三點繪製圓弧 求弧長

任意三點繪製圓弧 求弧長

接著  http://blog.csdn.net/ilson_/article/details/77018346

1. 先求出線的方向角(用向量)

// 得到兩點的角度 
// 0 - 360 以 point1 為圓心繞一週
double CShape::getAngleFromTwoPoint(CPoint point1, CPoint point2)
{
    double angle = 0;
CPoint O = point1; //以第一點為圓心旋轉
CPoint A = point2;

double r = getTheRealLengthOfTheLine(O, A, FALSE); //這只是求兩點間距離很簡單的我就不貼了
CPoint B = CPoint(O.x + r, O.y); //以圓心O為起點 O點右側距離r個畫素長度做B點(O->B)
CPoint OA = CPoint(A.x - O.x, A.y - O.y); //向量OA O->A
CPoint OB = CPoint(B.x - O.x, B.y - O.y); //向量OB O->B

double sin = (OA.x * OB.y - OB.x * OA.y) / (r * r); // |OA| = |OB| = r
angle = ASIN(sin); //弧度 ASIN(c) = (asin(c) * (180.0 / PI))

if (O.x < A.x && O.y > A.y)  //象限1
angle = angle;
else if (O.x > A.x && O.y > A.y) //象限2
angle = 180 - angle;
else if (O.x > A.x && O.y < A.y) //象限3
angle = 180 - angle;
else if (O.x < A.x && O.y < A.y) //象限4
angle = 360 + angle;

return angle;
}

2. 主要判斷B點的範圍

// 計算弧長 L = ⊙ * r (弧度 * 半徑)
// 判斷中點B與圓心O是否在 AC 夾角內
// 如果在 圓弧角度為 angle = A角 - C角; 如果不在 angle = 360 - (A角 - C角) 取反
void CMyArc::getTheDataOfTheArc(OUT double &lengthArc, OUT double &angle)
{
CPoint O = m_ptResetPoint[3]; //圓心
CPoint A = m_ptResetPoint[0]; //起點
CPoint B = m_ptResetPoint[1]; //中點
CPoint C = m_ptResetPoint[2]; //終點

double OA = getAngleFromTwoPoint(O, A, TRUE);
double OB = getAngleFromTwoPoint(O, B, TRUE);
double OC = getAngleFromTwoPoint(O, C, TRUE);

double fMax = max(OA, OC);
double fMin = min(OA, OC);
if (OB > fMin && OB < fMax)
angle = fMax - fMin;
else
angle = 360 - (fMax - fMin);

double r = getTheRealLengthOfTheLine(O, A, TRUE) * m_fRealRuler;
double radian = angle * PI / 180; //角度轉弧度
lengthArc = radian * r;
}

相關推薦

任意繪製圓弧

接著  http://blog.csdn.net/ilson_/article/details/77018346 1. 先求出線的方向角(用向量) // 得到兩點的角度  // 0 - 360 以 point1 為圓心繞一週 double CShape::getAng

任意繪製圓弧

接著  http://blog.csdn.net/ilson_/article/details/77018346 1. 先求出線的方向角(用向量) // 得到兩點的角度  // 0 - 360 以 p

HDU 6206 Apple ( 高精度 && 計算幾何 && 構圓圓心半徑 )

void 一條直線 col 簡單的 ply 操作 lap image ann 題意 : 給出四個點,問你第四個點是否在前三個點構成的圓內,若在圓外輸出"Accepted",否則輸出"Rejected",題目保證前三個點不在一條直線上。 分析 : 簡單的計算幾何問題,如果

已知拱高和絃、半徑、角度

按鈕click事件程式碼:        private void btnCal_Click(object sender, EventArgs e)        {            if (txth.Text.Trim() == "")            {   

給出面積,三角形的任意,gcd 用來約分

面積 www. a* 條件 span char 都是 pro nbsp http://codeforces.com/contest/1058/problem/D 條件 1. 給出面積m*n/k 2. 0≤x1,x2,x3≤n 0≤y1,y2,y3≤m 3

如何動態的畫圓弧 其實主要是能知道繪製圓弧的方向就行

    由於需求,我需要動態的在介面上隨意的點下三個點繪製一段圓弧,可是繪製圓弧的方向可不太好控制,我嘗試著自己寫條件去控制方向可是沒有一個成功的,於是我網上找了一天,但是都沒有找到解決的方法。     回到宿舍不甘心的我又開始了,不過最終我在百度上看

已知矩形的任意第四個

      做car的旅行路線遇到的,先用向量法找出直角邊,再利用對角線上的點橫座標之和等於中點橫座標的二倍求出。 #include<cstdio> struct zuobiao { int x,y; }; zuobiao qiudian(int

POJ 3592--Instantaneous Transference【SCC縮新建圖 &amp;&amp; SPFA路 &amp;&amp; 經典】

col describe sca 搜索 hat style ecif test csdn Instantaneous Transference Time Limit: 5000MS Memory Limit: 65536K

Scala實現:已知坐標,最短距離(如果在垂足不在線段內,最短距離為到其中一點的直線距離)

線段 在線 obj creat sqrt reat 最短距離 最小 space /** * 已知三點坐標,求其中一點到另兩點的垂線距離 * (如果在垂足不在線段內,最短距離為到其中一點的直線距離) * Created by wzq on 17-11-2. */obj

golang實現已知三角形坐標,三角形面積

長度 truct bsp class nbsp angle triangle ret cto 代碼如下: func GetTriangleAreaByVector(x vector.Vector3,y vector.Vector3,z vector.Vector3) fl

BZOJ5450: 轟炸(水題,Tarjan縮路)

5450: 轟炸 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 43  Solved:18[Submit][Status][Discuss] Description 有n座

已知圓上座標,圓半徑 r 和 圓心座標

問題: 已知圓上三個點座標分別為(x1,y1)、(x2,y2)、(x3,y3) 求圓半徑R和圓心座標(X,Y) X,Y,R為未知數,x1,y1,x2,y2,x3,y3為常數 則由圓公式: (x1-X)²+(y1-Y)²=R²     

Python迴文字串(重迴圈遍歷所有字串 新)

前兩天自己寫了下,雖然對了,但是思路不太好,網上看了遍歷的思路,瞬間感覺之前好蠢,雖然本質上我的程式碼也是遍歷,但是思路不好。 正確思路就是先遍歷出所有長度大於等於2的字串,然後在逐一判斷這些字串是不是迴文字串就行了,思路清晰了,程式碼就簡單多了,10分鐘就寫完了。 d

已知圓上座標圓心和半徑

R半徑 PCenter圓點座標  public void GetCircular(PointF P1,PointF P2,PointF P3,ref float R,ref PointF PCenter) { float a

C# 已知 之間夾角角度

public static double Angle(Point cen, Point first, Point second)   {    &nb

已知平面的法向量 —— 兩種方法

最近學圖形學時遇到了這個問題,PPT 給的大概是一個通過線性代數的方法求的,有點看不懂。加上線性代數早就忘光了,更加是一臉茫然。但是這個知識點在高中講過,自己卻怎麼也記不起來了,直到今天突然記起來了,特此記錄一下。 問題描述 已知三點

如何使用MATLAB對任意維資料繪製維曲面

這段時間寫論文,用到MATLAB繪製三維曲面,而由於三組資料是同樣維度,不能直接使用mesh或者surf等繪圖命令進行繪圖,這時候怎麼辦呢?     方法:將兩組資料運用擬合的方法得到關於第三組資料的迴歸方程,通過迴歸方程和meshgrid擴充資料點。

【連結串列問題】單向連結串列判斷是否有環、入環節連結串列長度

目錄   題目: 思路: 程式碼實現 注意點 此題的其他變式 題目 判斷一個單項鍊表是否有環,如果有環,返回入環節點的值,如果無環,返回-1.要求空間複雜度為O(1). 思路 空間複雜度如果沒有要求, 可以用雜湊表來判斷。 在空間複雜度為O(

OpenLayers 學習()向量圖層上新增繪製、線、多邊形

建立向量圖層,新增EditingToolbar類物件,該物件可以在向量圖層上新增點繪製點、線、多邊形等。 原始碼為: <!DOCTYPE html> <html> <head> <title> 向量圖層上新增點繪製點、線、

拼多多筆試題一:給出一個無序整數陣列,任意個數的最大乘積

題目: 給出一個可能包含正數、零、負數的無序整數序列,從該序列中任選三個數計算乘積,求最大的乘積是多少? 要求:演算法的時間複雜度為O(n),空間複雜度為O(1). 輸入: 第一行輸入n表示序列中整數的個數 第二行輸入n個整數 輸出; 最大的乘積 例如: 輸入: 4 1 0