C 繪製乙個角並且在兩角中間顯示出具體的角度

2021-08-14 14:00:57 字數 2812 閱讀 7249

1.先看乙個效果:

2.理論基礎

有兩條直線l1(om)和l2(on)構成乙個夾角∠mon,大小為α,頂點為o,以o為圓心r為半徑做圓,交l1和l2分別為c點和d點。做∠α的角平分線與圓o交與點a,在圓o的3點鐘方向做一條直線l4,過點a做l4的垂線,垂足為b。則矩形aefg是圓o的內接矩形。a點位置就是要列印顯示具體度數的位置。

1. 圓弧的所在圓的直徑取線段om和on中較短的乙個線段的一半。

2. 求出∠α的度數。根據以下函式計算出兩條直線的角度。

3. 計算出∠aob的度數,為下面求出其正余弦值做準備。

∠aob=∠cob-∠α/2

4. 計算出線段ab和線段ob的長度。

5. 在內接矩形的長為2*ob=a,寬度為2*ab=b

6. 內接矩形左上角的座標為:x = 圓心的橫座標 - a/2 ; y = 圓心的縱座標 - b/2

7. 在具體的角度顯示的位置:內接矩形的右上角也就是a的位置

3.函式說明

計算兩條射線的角度:

#define pi 3.141592653589793

struct vertex

};// 以pt1為m點 pt2為n點 c為o點

double angleoftwovector(vertex&pt1, vertex&pt2, vertex&c)

if (theta < -pi)

theta = theta * 180.0 / pi;

return theta;

}

繪製角度:

//繪製角度

/* void qpainter::drawarc(int x, int y, int width, int height, int startangle, int spanangle)

(1)以座標(x,y)為起點,沿x軸正方向延伸w個 單位,沿y軸的正方向延伸h個單位,得到乙個矩形,此虛擬矩形內切繪製乙個橢圓(如果w和h相 等,則為圓)。

(2)以矩形的中心為圓心,以時鐘3點的方向為0°,逆時針為正方向,從0°正方向旋轉startangle 度,和橢圓相交得到一條直線和乙個交點。

(3)從這條直線開始,正方向旋轉arcangle度,得到另一條直線和交點,這樣就得到了乙個兩交點之間的 圓弧。

*/void measureangle::drawangle(qpainter*painter, qpoint screenstart, qpoint screencenter, qpoint screenend) else

//計算弧線的起始角度

vertex end;

end.x = ptcenter.x + 100;

end.y = ptcenter.y;

double startangle = utility::angleoftwovector(ptstart, end, ptcenter);

if (startangle <= 0) else

double firstlen = utility::lenthoftwopoint(screenstart, screencenter);

double secondlen = utility::lenthoftwopoint(screenend, screencenter);

double len = firstlen > secondlen ? secondlen : firstlen;

//繪製弧線

int x = screencenter.x() - len / 2;

int y = screencenter.y() - len / 2;

int w = len;

int h = len;

painter->drawarc(x, y, w, h, startangle * 16, -angle * 16);

//顯示座標值

painter->setfont(font);

qstring str = qstring::number(angle, 10, 2);

str += qstringliteral("°");

double centerax = startangle - angle / 2;//兩條直線夾角的一般

double exrendlenx = cos(pi / 180 * centerax)*(len/2);

double exrendleny = sin(pi / 180 * centerax)*(len/2);

//繪製外接矩形

#if 0

painter->drawrect(x, y, w, h);

#endif

int x0 = screencenter.x() - exrendlenx;

int y0 = screencenter.y() - exrendleny;

int w0 = exrendlenx * 2;

int h0 = exrendleny * 2;

#if 0//繪製內接矩形

painter->drawrect(x0, y0, w0, h0);

#endif

painter->drawtext(x0 + w0 + 5, y0 -5, str);

}

179在螢幕中繪製乙個三角形

效果如下 設定線條的連線端點 24 cgcontextstrokepath contextref 沿著要求的路徑,開始繪製25 26 void touchesended nsset touches withevent uievent event 34if marrpoint.count 3 39 s...

Android繪製乙個三角形並且可動態改變顏色

這種方法的三角形角度沒法控制,因為其實是矩形旋轉。然後將此xml設定為控制項的background,在 中,如下使用 layerdrawable layerdrawable layerdrawable view.getbackground gradientdrawable drawable grad...

GLFW繪製兩個三角形拼接為乙個矩形

include include include include 改變視窗大小 引數列表 視窗指標,修改後的寬,高 void framebuffer glfwwindow window,int w,int h 輸入監聽 void input glfwwindow window else if glfw...