一、
總有一些圖形會出乎意料:
參數為:
1、
//輸入初始參數:
double arc1 = (-5.0 / 16.0)*Pild;//
//hdc:畫板,arc1入射角-Pi~~+Pi,3線段次數,x=400,y=310為起始點!
light01line03(hdc, arc1, 3, 400, 310);//
如:

2、
rc1 = (-7.0 / 16.0)*Pild;//
//hdc:畫板,arc1入射角-Pi~~+Pi,3線段次數,x=400,y=310為起始點!
light01line03(hdc, arc1, 3, 400, 310);//

核心代碼:
```
//hdc繪圖板, arc1arg01入射角 linelength線長,x0初始點坐標X,y0:Y初始
int light01line03(HDC hdc, double arc1arg01, unsigned long linelength, double x0, double y0) {
double arc1arg02;
arc1arg02 = regularAngle(arc1arg01);
double X001 = x0;
double Y001 = y0;
line2normal(hdc, arc1arg01, X001, Y001, RGB(0, 200, 200),10);
cout << "[arc1arg01:" << arc1arg01 << "]-";
cout << "[arc1arg02:" << arc1arg02 << "]; ";
unsigned long itime = 0;
// int laiguoTimes = 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 {
label01star01begin01:
if (linelength < 1) { return 1; }
lable110:
//++itime;
itime = 1;
cout << "[itime:" << itime << "]_";
lable220:
//開始算 反射角,并 (繼續)光進
Xorigin01 = cos(arc1arg02)*(double)itime; Yorigin01 = sin(arc1arg02)*(double)itime;
lable230:
X001 = Xorigin01 + old1X001; Y001 = Yorigin01 + old1Y001;
cou02t << "[X001:" << X001 << "]-";
cou02t << "[Y001:" << Y001 << "];"<<endl;
setpixe02l(hdc, X001, Y001, RGB(255, 25, 0));// , 255, 0));//封裝,封裝都是有目的 的;沒有目的 的“瞎封裝”…會從我的小組被開除.
//下面進入判斷是否該反射,咋反射(和哪個圓反射…!
lable330:
//判斷點的狀態
// if (isInC1Bigcircle(X001, Y001) && (isInC2littlecircle(X001, Y001)) //if110 此點(新舊點)都在兩圓內
if(1==isInTwoCircles(X001,Y001) ) //
{
setpixe02l(hdc, X001, Y001, RGB(255, 0, 0));//
cou02t << "[01itime:" << itime << "]_";
old1X001 = X001; old1Y001 = Y001;
// ++itime;
itime = 1;
goto lable220;
}//if110
//與小圓相交-下面的:old點在 小圓(兩圓)內,而新點 在 小圓(c2)外(但在大圓內--即與小圓的(下弧)相交唄
else if ( isInTwoCircles(old1X001,old1Y001) && (isInC1Bigcircle(X001, Y001) && (!isInC2littlecircle(X001, Y001)) ) ) //if110elseif110
{
arc01normal01origin001 = atan((400 - X001) / (Y001 - 400));
if (0 == arc01normal01origin001) {
// arc01normal01origin001 = 0.00001;
cou04t << "[2小圓外itim01e:" << itime << "]__";
itime = 1;
}
arc1normal01 = Pild / 2.0 + arc01normal01origin001;
line2normal(hdc, arc1normal01, old1X001, old1Y001, RGB(0, 0, 100), 4);// 60);//藍 法線
fanshe01Arc01 = arc1arg02 - 2 * arc1normal01;
reflecteAng01 = Pild- fanshe01Arc01;
line2normal(hdc, reflecteAng01, old1X001, old1Y001, RGB(0, 200, 0), 6);// 90);//綠試畫反射線 0, 0, 200));
arc1arg02 = reflecteAng01;
cou04t << "[2小圓外itim2e:" << itime << "]_";
itime = 1;
//這時回去,不用新點X001..!用old1X001等
line2normal(hdc, arc1normal01, old1X001, old1Y001, RGB(0,0,200));
goto lable220;
}//if110elseif110
//與大圓相交//下面的:old點在 兩圓(大圓、小圓)內,而新點 跑在 大圓外(但在小圓內--即與大圓(C1)相交
else if (isInTwoCircles(old1X001,old1Y001) && ( !isInC1Bigcircle(X001,Y001)&& (isInC2littlecircle(X001,Y001) ) ) )//if110elseif120
{
arc01normal01origin001 = atan((400 - X001) / (Y001 - 0));
arc1normal01 = -(Pild / 2.0 - arc01normal01origin001);
line2normal(hdc, arc1normal01, old1X001, old1Y001, RGB(0, 0, 255), 9);//藍 法線
fanshe01Arc01 = Pild + arc1arg02 - 2 * arc1normal01;
reflecteAng01 = - fanshe01Arc01;
arc1arg02 = reflecteAng01;
line2normal(hdc, reflecteAng01, old1X001, old1Y001, RGB(255, 200, 0), 5);//黃試畫反射線 0, 0, 200));
line2normal(hdc, reflecteAng01, X001, Y001, RGB(0, 200, 0), 10);//綠試畫反射線 0, 0, 200));
cou04t << "[itime:" << itime << "]_";
cou04t << "[跑到大圓外itime:" << itime << "]__";
itime = 1;
//這時回去,不用新點X001,Y001
++itime;
// old1X001 = X001; old1Y001 = Y001;
// X001 = old1X001; Y001 = old1Y001;
goto lable220;
}//if110elseif120
//Old點(還)在兩圓內, (而)新點X001,Y001在兩圓外了
else if ( isInTwoCircles(old1X001,old1Y001) &&( !isInC1Bigcircle(X001, Y001) && !(isInC2littlecircle(X001, Y001) ) ) )//if110elseif130
{
lable450:
//迭代找交點(找有 1圓相交了)
mid01X01 = (X001 + old1X001) / 2;
mid01Y01 = (X001 + old1Y001) / 2;
if (isInTwoCircles(mid01X01, mid01Y01)) {
old1X001 = mid01X01;
old1Y001 = mid01Y01;
cout << "[old1X001:" << old1X001 << "]-";
cout << "[old1Y001:" << old1Y001 << "]; ";
cout << "[X001:" << X001 << "]-";
cout << "[Y001:" << Y001 << "]; ";
cout << "[mid01X01:" << mid01X01 << "]-";
cout << "[mid01Y01:" << mid01Y01 << "]; ";
goto lable450;
}//if550
else { //此時:mid 點 (都)在 兩圓外了?
X001 = mid01X01; //退回半(中間點)
Y001 = mid01Y01;
goto lable330; //總之,要 一腳old在兩圓內,而一腳(X001,Y001)在單圓外,發生反射,才跳出 lable330到本段 程序。
}//if550else560
//迭代找交點(哪個圓 先相交)
}//if110elseif130
else ////if110else240
{
mid01X01 = (X001 + old1X001) / 2;
mid01Y01 = (X001 + old1Y001) / 2;
goto lable330;
}//if110else240
lable420:
old1X001 = X001; old1Y001 = Y001;
if (itime <= linelength) { goto lable110; }
// } while (true);//循環光走(光線前進)并反射等
}//int light01line03(HDC hdc, double arc1arg01, unsigned long linelength, double x0, double y0
//
```
- 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