先上圖:
初始參數(設置):
//輸入初始參數:
double arc1 = (7.0 / 16.0)*Pild;
line01light02(hdc, arc1, 19, 300, 410); //參數說明: hdc繪圖板,入射角arc1= 7/16PI, x1=300,y1=410為入射光線初始坐標

核心代碼:
void line01light02(HDC hdc, double arc1, unsigned long lineLen, double X01, double Y01) {
//
double arc1arg02 = regularAngle(arc1);
double X001 = X01; double Y001 = Y01;
double X002 = X001; double Y002 = Y001;
line2normal(hdc, arc1, X001, Y001, RGB(0, 200, 200), 10);
cout << "[arc1arg01:" << arc1 << "]-";
cout << "[arc1arg02:" << arc1 << "]; ";
unsigned long itime = 0;
double old1X001 = X001; double old1Y001 = Y001;
double mid01X01 = X001; double mid01Y01 = Y001;
double arc01normal01origin001;
double arc1normal01;
double fanshe01Arc01;
double reflecteAng01;
double Xorigin01; double Yorigin01;
//
//循環光走(光線前進-簡稱光進)并反射等
//do {
//
lable110start:
if (lineLen < 1) { return; }
lable120:
itime = 1;
cout << "[itime:" << itime << "]_";
lable220:
//開始算 反射角,并 (繼續)光進
Xorigin01 = cos(arc1arg02)*(double)itime; Yorigin01 = sin(arc1arg02)*(double)itime;
lable230:
X001 = Xorigin01 + old1X001; Y001 = Yorigin01 + old1Y001;
setpixe02l(hdc, X001, Y001, RGB(255, 25, 0));// , 255, 0));//繪圖封裝,封裝都是有目的 的;沒有目的 的“瞎封裝”…會從我的小組被開除--Terry.
lable510:
//判斷并(光線)步進:
//if先判斷是否在月亮形狀里: (isInC2littlecircle && !isInC1BigCircle)
if (isInMoon(X001, Y001)) {//if110
itime = 1;
lineLen--;
old1X001 = X001; old1Y001 = Y001;
itime++;
goto lable220;
}//if110
//與小圓的上弧相交,else if下面判斷:是否出了月亮,即出了小圓,(當然)也出了大圓
else if ( isInMoon(old1X001,old1Y001) && (!isInC2littlecircle && !isInC1BigCircle) ) {
double arc01normal01origin01 = atan( (400-X001)/(Y001-400) );
arc1normal01 = Pild / 2.0 + arc01normal01origin01;
line2normal(hdc, arc1normal01, old1X001, old1Y001, RGB(0, 100, 0), 5); //暗綠色法線
fanshe01Arc01 = arc1arg02 - 2 * arc1normal01;
reflecteAng01=Pild - fanshe01Arc01;
line2normal(hdc, reflecteAng01, old1X001, old1Y001, RGB(0, 255, 0), 6);//亮綠色反射線
arc1arg02 = reflecteAng01;
cout << "[01-arc1normal01:" << arc1normal01 << "]";
// system("pause");
goto lable220;
}//if110elseif120
//elseif下面判斷:是否出了月亮,既然在小圓內,(但)仍然在大圓內(兩圓相交處
else if ( isInMoon(old1X001,old1Y001) && (isInC2littlecircle && isInC1BigCircle) ) {
arc01normal01origin001 = atan((400 - X001 / (Y001 - 0) ) );
arc1normal01 = (Pild / 2.0 - arc01normal01origin001);
line2normal(hdc, arc1normal01, old1X001, old1Y001, RGB(0, 0, 100), 19); //暗藍法線
fanshe01Arc01 = Pild + arc1arg02 - 2 * arc1normal01;
reflecteAng01 = fanshe01Arc01;
arc1arg02 = reflecteAng01;
line2normal(hdc, reflecteAng01, old1X001,old1Y001, RGB(255, 200, 0), 5);
cout << "[arc1normal01:" << arc1normal01 << "]";
system("pause");
goto lable220;
}//if110elseif130
//不在小圓內,但在大圓內(第4塊--特殊區域
else if (!isInC2littlecircle&&isInC1BigCircle)
{
lable910:
//迭代找第1次,第一個弧的交點,即不在inInMoon內的第一個點
mid01X01 = (X001 + old1X001) / 2;
mid01Y01 = (Y001 + old1Y001) / 2;
if (isInMoon(mid01X01, mid01Y01)) {
goto lable910;
}
else//注意此時,mid01X01,Y01不在Moon內了,已經
{
X001 = mid01X01; Y01 = mid01Y01; //相當于退回中點(中值點
goto lable510;
}
}//if110elseif140
//
//while (true);
//
//
}//
- vs2017宇宙最偉大IDE用Console等調試匯總
- c++Win32起始鼠標作圖181101
- 用迭代法找(兩圓的)交點-精確計算迭代并改進-數值周期1810
- 精度-比例關系181110P2點
- 用迭代法求找兩圓交點-精度計算181111A
- 月亮型-大小圓-上下圓算法181121
- 用c++的數學計算及圖形繪制總結之1/共4-181101
- 用c++做數學計算及圖形繪制總結之2/4-181102
- 用c++做數學計算及圖形繪制總結之3/4-181103
- 用c++做數學計算及圖形繪制總結4/4-181104
- 用c++的移位代替乘除運算181105
- 重構billiard2圓相交-非遞歸181101-非預料內圖形-原因分析181201
- 重構月亮型billiard202圓相交-非遞歸181102-非預料內圖形-原因分析181202
- 重構月亮型billiard202圓相交-非遞歸181102b-非預料內圖形-原因分析181202b
- 單橢圓(非遞歸)18圣誕后-ok版181225