一、
1、參數:
arc1 = (-3.0 / 16.0)*Pild;
int x1 = 290;
int y1 = 410;
line01light02(hdc, arc1, 19, x1,y1); //參數說明: hdc繪圖板,入射角arc1= 7/16PI, x1=300,y1=410為入射光線初始坐標

核心代碼:
```
void line01light02(HDC hdc, double arc1, unsigned long lineLen, double X01, double Y01) {
//
cou02t.open("f:/Cout181206cou02t_1202.txt");
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;
cou02t << "[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) && (1!=isInC2littlecircle(X001,Y001) && 1!=isInC1BigCircle(X001,Y001) ) ) {
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;
cou02t << "[01-arc1normal01:" << arc1normal01 << "]";
// system("pause");
goto lable220;
}else if ( isInMoon(old1X001,old1Y001) && (1==isInC2littlecircle(X001,Y001) && 1==isInC1BigCircle(X001,Y001) ) ) {
cou02t << "Hell01!" << endl;
//if110elseif120
//elseif下面判斷:是否出了月亮,既然在小圓內,(但)仍然在大圓內(兩圓相交處
//先規格、規范化入射角:
double arc1ang03=arc1arg02;
// arc1ang03= regularAngle(arc1arg02);
while (arc1ang03 > Pild) { arc1ang03 =arc1ang03- 2 * Pild; }
while (arc1ang03 < -Pild) { arc1ang03 = arc1ang03 + 2*Pild; }
//arc01normal01origin001 = atan((-400 +X001 / (Y001 - 0) ) );
arc01normal01origin001 = asin((-X001 + 400) / 400);
arc1normal01 = Pild/2.0+ arc01normal01origin001;//(/*Pild / 2.0*/ - arc01normal01origin001);
// line2normal(hdc, arc1normal01, old1X001, old1Y001, RGB(0, 200,0), 15); //暗Green法線
line2normal(hdc, Pild+arc1normal01, old1X001, old1Y001, RGB(0, 200, 0), 395); //暗Green法線
fanshe01Arc01 = Pild+arc1ang03 - 2 * arc1normal01;
reflecteAng01 = -fanshe01Arc01;
cou02t << "Hello!" << endl;
cou02t << endl << "[入射角arc1arg02:" << arc1arg02 << "(角度:" << arc1arg02 * 180.0 / Pild << "]_";
cou02t << endl << "[入射角規范化arc1ang03:" << arc1ang03 << "(角度:" << arc1ang03 * 180.0 / Pild << "]_";
cou02t << endl<<"[法線arc01normal01origin001" << arc01normal01origin001 << "(角度:" << arc01normal01origin001 * 180.0 / Pild << "]_";
cou02t << "[arc1normal01" << arc1normal01 << "(角度:" << arc1normal01 * 180.0 / Pild << "] ";
cou02t << "[reflecteAng01" << reflecteAng01 << "(反射角度:" << reflecteAng01 * 180.0 / Pild << "]" << endl;
arc1arg02 = reflecteAng01;
line2normal(hdc, reflecteAng01, old1X001,old1Y001, RGB(0,0,255), 6); //藍色反射線
cou02t << "[arc1normal01:" << arc1normal01 << "]";
// system("pause");
goto lable220;
}//if110elseif130
//不在小圓內,但在大圓內(第4塊--特殊區域
else if (isInMoon(old1X001,old1Y001) && (!isInC2littlecircle(X001,Y001)&&isInC1BigCircle(X001,Y001) ) )
{
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);
//
}//void line01light02(
```
完整代碼:
```
// WinPro1moon01billiard181202a1.cpp : 定義應用程序的入口點。
#include "stdafx.h"
#include "WinPro1moon01billiard181202a1.h"
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
#define MAX_LOADSTRING 100
// 全局變量:
//浮點數計PI(π):
long double Pild = 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196;
HINSTANCE hInst; // 當前實例
WCHAR szTitle[MAX_LOADSTRING]; // 標題欄文本
WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口類名
ofstream cou02t;
// 此代碼模塊中包含的函數的前向聲明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 在此處放置代碼。
//調用Console控制臺
AllocConsole();
#pragma warning(disable:4996)
_tfreopen(TEXT("CONOUT$"), TEXT("w"), stdout);
_tfreopen(TEXT("CONOUT$"), TEXT("w"), stderr);
_tfreopen(TEXT("CONIN$"), TEXT("r"), stdin);
#pragma warning(default:4996)
_tsetlocale(LC_ALL, TEXT("chs"));
//
cout << setprecision(99) << Pild << endl;
// 初始化全局字符串
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_WINPRO1MOON01BILLIARD181202A1, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// 執行應用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINPRO1MOON01BILLIARD181202A1));
MSG msg;
// 主消息循環:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// 函數: MyRegisterClass()
//
// 目標: 注冊窗口類。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINPRO1MOON01BILLIARD181202A1));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINPRO1MOON01BILLIARD181202A1);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
}
//
// 函數: InitInstance(HINSTANCE, int)
//
// 目標: 保存實例句柄并創建主窗口
//
// 注釋:
//
// 在此函數中,我們在全局變量中保存實例句柄并
// 創建和顯示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // 將實例句柄存儲在全局變量中
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
int C2R200little = 200;
int C2_X02little_pianyi400 = 400;
int C2_Y02little_pianyi400 = 400;
int Y_high600 = 600;
int C1R1big400 = 400;
int C1_X01big_pianyi400 = 400;
int C1_Y01big_pianyi400 = 0;// 100;
//
double regularAngle(double ang1) {
while (ang1 < -(Pild)) { ang1 + 2 * Pild; }
while (ang1 > Pild) { ang1 - 2 * Pild; }
return ang1;
}
//
void setpixe02l(HDC hdc, int x, int y, COLORREF rgb1) {
SetPixel(hdc, x, Y_high600 - y, rgb1);
}
void setpixe03l(HDC hdc, int x, int y, COLORREF rgb1 ,int R=3) {
SetPixel(hdc, x, Y_high600 - y, rgb1);
for (int i = 0; i < 360; ++i) { int x = R*cos(i); int y = R*sin(i);
setpixe02l(hdc, x, y, rgb1);
}
}
//專畫法線
void line2normal(HDC hdc, double arc1, double x, double y, COLORREF rgb1, double R) {
for (int i = 0; i < R; ++i) {
int x001 = i * cos(arc1) + x;
int y001 = i * sin(arc1) + y;
setpixe02l(hdc, x001, y001, rgb1);
}
}
//
//計算歐氏(歐幾里得)距離
double SquareOfEuclideanDistance(double x1, double x0, double y1, double y0) {
return((x1 - x0)*(x1 - x0) + (y1 - y0)*(y1 - y0));
}
//
int isInC1BigCircle(double x1, double y1) {
if (SquareOfEuclideanDistance(x1, 400, y1, 0) <= (400 * 400)) {
return 1;
}
else return 0;
}
//
int isInC2littlecircle(double x1, double y1) {
if (SquareOfEuclideanDistance(x1, 400, y1, 400) <= (200 * 200)) {
return 1;
}
else return 0;
}
//in Moon ,即在小圓,不在大圓里
int isInMoon(double x, double y) {
if (1 == isInC2littlecircle(x, y) && 1 != isInC1BigCircle(x, y)) {
return 1;
}
return 0;
}
//
//
void line01light02(HDC hdc, double arc1, unsigned long lineLen, double X01, double Y01) {
//
cou02t.open("f:/Cout181206cou02t_1202.txt");
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;
cou02t << "[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) && (1!=isInC2littlecircle(X001,Y001) && 1!=isInC1BigCircle(X001,Y001) ) ) {
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;
cou02t << "[01-arc1normal01:" << arc1normal01 << "]";
// system("pause");
goto lable220;
}else if ( isInMoon(old1X001,old1Y001) && (1==isInC2littlecircle(X001,Y001) && 1==isInC1BigCircle(X001,Y001) ) ) {
cou02t << "Hell01!" << endl;
//if110elseif120
//elseif下面判斷:是否出了月亮,既然在小圓內,(但)仍然在大圓內(兩圓相交處
//先規格、規范化入射角:
double arc1ang03=arc1arg02;
// arc1ang03= regularAngle(arc1arg02);
while (arc1ang03 > Pild) { arc1ang03 =arc1ang03- 2 * Pild; }
while (arc1ang03 < -Pild) { arc1ang03 = arc1ang03 + 2*Pild; }
//arc01normal01origin001 = atan((-400 +X001 / (Y001 - 0) ) );
arc01normal01origin001 = asin((-X001 + 400) / 400);
arc1normal01 = Pild/2.0+ arc01normal01origin001;//(/*Pild / 2.0*/ - arc01normal01origin001);
// line2normal(hdc, arc1normal01, old1X001, old1Y001, RGB(0, 200,0), 15); //暗Green法線
line2normal(hdc, Pild+arc1normal01, old1X001, old1Y001, RGB(0, 200, 0), 395); //暗Green法線
fanshe01Arc01 = Pild+arc1ang03 - 2 * arc1normal01;
reflecteAng01 = -fanshe01Arc01;
cou02t << "Hello!" << endl;
cou02t << endl << "[入射角arc1arg02:" << arc1arg02 << "(角度:" << arc1arg02 * 180.0 / Pild << "]_";
cou02t << endl << "[入射角規范化arc1ang03:" << arc1ang03 << "(角度:" << arc1ang03 * 180.0 / Pild << "]_";
cou02t << endl<<"[法線arc01normal01origin001" << arc01normal01origin001 << "(角度:" << arc01normal01origin001 * 180.0 / Pild << "]_";
cou02t << "[arc1normal01" << arc1normal01 << "(角度:" << arc1normal01 * 180.0 / Pild << "] ";
cou02t << "[reflecteAng01" << reflecteAng01 << "(反射角度:" << reflecteAng01 * 180.0 / Pild << "]" << endl;
arc1arg02 = reflecteAng01;
line2normal(hdc, reflecteAng01, old1X001,old1Y001, RGB(0,0,255), 6); //藍色反射線
cou02t << "[arc1normal01:" << arc1normal01 << "]";
// system("pause");
goto lable220;
}//if110elseif130
//不在小圓內,但在大圓內(第4塊--特殊區域
else if (isInMoon(old1X001,old1Y001) && (!isInC2littlecircle(X001,Y001)&&isInC1BigCircle(X001,Y001) ) )
{
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);
//
}//void line01light02(HDC hdc, double arc1, unsigned long linelen, double x0, double y0
//
//
void wm01paint01(HDC hdc) {
//畫2圓:
//畫小圓Circle02:
for (int i = 0; i < 361; ++i) {
double arc02 = i * Pild / 180;
int x02little = cos(arc02)*C2R200little + C2_X02little_pianyi400;
int y02little = sin(arc02)*C2R200little + C2_Y02little_pianyi400;
setpixe02l(hdc, x02little, y02little, RGB(0, 100, 0) );
}
//畫大圓Circle01:
for (int i = 0; i < 10*350; ++i) {
double arc01 = i * Pild / 180 /10;
int x02big = cos(arc01)*C1R1big400 + C1_X01big_pianyi400;
int y02big = sin(arc01)*C1R1big400 + C1_Y01big_pianyi400;
setpixe02l(hdc, x02big, y02big, RGB(0, 100, 0));
}
double arc1;
//輸入初始參數:
arc1 = (-3.0 / 16.0)*Pild;
int x1 = 290;
int y1 = 410;
line01light02(hdc, arc1, 19, x1,y1); //參數說明: hdc繪圖板,入射角arc1= 7/16PI, x1=300,y1=410為入射光線初始坐標
setpixe02l(hdc, 1 + x1, 1 + y1, RGB(0, 0, 255));
setpixe03l(hdc, x1, y1, RGB(0, 0, 255),5);
}//void wm01paint01(HDC hdc
// 函數: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目標: 處理主窗口的消息。
//
// WM_COMMAND - 處理應用程序菜單
// WM_PAINT - 繪制主窗口
// WM_DESTROY - 發送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// 分析菜單選擇:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{//case110
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: 在此處添加使用 hdc 的任何繪圖代碼...
wm01paint01(hdc);
EndPaint(hWnd, &ps);
}//case110
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// “關于”框的消息處理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
```
- 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