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...