1. 程式人生 > >QT 模仿Android遊戲中虛擬搖桿(3)讓圓隨著角度移動

QT 模仿Android遊戲中虛擬搖桿(3)讓圓隨著角度移動

接著上一篇講起,我們需要在滑鼠離開圓的範圍的時候,讓圓跟著滑鼠與圓心的角度移動,那麼我們來看看我們的已知量是什麼:

1、圓心座標

2、圓的半徑

3、當前滑鼠的座標

運用一下我們的中學知識,根據(1、3),可以得到圓心到滑鼠的線段與水平線的角度,相當於已知

4、滑鼠與圓心線段的角度

稍微整理一下得到下面的公式:

<span style="font-size:14px;">/*
         *
            搖桿的當前座標(x,y)
            圓點座標:(x0,y0)
            半徑:r
            角度:angle
            
            k = (y-y0)/(x-x0)
            angle = arctan k
            x = x0 + r * cos(angle * 3.14 / 180 )
            y = y0 + r * sin(angle * 3.14 / 180 )
         *
*/</span>
在這裡我們需要想到一個問題,那就是QT的角度計算公式不像在傳統的象限中計算,因為傳統象限中是:越往右X越大,越往上Y越大。但是QT的畫布是:越往右X越大,越往下Y越大,所以會出現:


我們可以看到QT由於Y軸與傳統象限相反,所以一、三象限和二、四象限相互調換了。

那麼根據QT的象限的規則,我們得出:

//bpoint: 滑鼠座標,centerPoint: 圓心座標
//第四象限 (0,90)
if(bpoint.rx()>centerPoint.rx() && bpoint.ry()<centerPoint.ry())
{}
//第一象限 (90,180)
else if(bpoint.rx()>centerPoint.rx() && bpoint.ry()>centerPoint.ry())
{}
//第二象限 (180,270)
else if(bpoint.rx()<centerPoint.rx() && bpoint.ry()>centerPoint.ry())
{}
//第三象限 (270,360)
else if(bpoint.rx()<centerPoint.rx() && bpoint.ry()<centerPoint.ry())
{}

我為了好記一點,之後的角度都是按照時鐘12點方向為0°(360°)順時針增加來計算的,

按照上述公式,我們得出如下的程式碼:

//第四象限 (0,90)
if(bpoint.rx()>centerPoint.rx() && bpoint.ry()<centerPoint.ry())
{
	double k = (double)(bpoint.rx()-centerPoint.rx())/(centerPoint.ry()-bpoint.ry());
	double angle= qAtan(k)/3.1415*180;
	bpoint.setX(centerPoint.rx() + r*qCos((angle-90.0)*3.1415/180));
	bpoint.setY(centerPoint.ry() + r*qSin((angle-90.0)*3.1415/180));
	move(bpoint);
	this->setText(QString::number(angle));
}
我們可以看到上面的程式碼全都是按照公式來計算的,那麼下一個象限是這個樣子的:
//第一象限 (90,180)
else if(bpoint.rx()>centerPoint.rx() && bpoint.ry()>centerPoint.ry())
{
	double k = (double)(bpoint.rx()-centerPoint.rx())/(bpoint.ry()-centerPoint.ry());
	double angle= 180-qAtan(k)/3.1415*180;
	bpoint.setX(centerPoint.rx() + r*qCos((angle-90.0)*3.1415/180));
	bpoint.setY(centerPoint.ry() + r*qSin((angle-90.0)*3.1415/180));
	move(bpoint);
	this->setText(QString::number(angle));
}
分析一下,上面兩段程式碼其實沒有什麼區別,但是angle的計算方法不同是因為按照分四個象限的方法求出的角度都是(0°,90°)的,不能表示90°以上的值,我們將這個角度顯示成正常的按照順時針增加的角度,就可以讓搖桿正常顯示了。

還有兩個象限的程式碼都是差不多的,只是角度的計算不一樣,我就不貼出來了,就這樣,模仿Android遊戲中的虛擬搖桿製作完畢,說起來很慚愧,完成這個功能只用了一個下午的時間,但是寫這個部落格卻分別佔用了三個時間,本以為可以一口氣寫完的,但是很難靜下心來寫,最近還有大量的工作需要做,好了,不吐槽了,就這樣吧,之後我會將可執行檔案釋出到此部落格中,拜~

2016 年8月29日打卡!