<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ?先看效果圖: ![](https://box.kancloud.cn/d89fccb2c37a185345280d5a0fc5a18f_510x473.png) ?左側綠色線條和右側藍色線條是反射光線的法線,用來校正每條光線發射正確…… ?下圖是去掉法線的效果: ![](https://box.kancloud.cn/488cb308514f27b871f36e5b3c848ef9_516x467.png) `` ![](https://box.kancloud.cn/ed7712dbb9cc3650b409926f08877b65_517x493.png) ?改變顏色的目的,主要是為下一步做“頻數”統計做準備; ?即準備下一步的工作:即下一步需要統計每個點的光照頻數。 ?主要思路和部分代碼 ?(全部代碼已經超出kancloud的允許長度) ``` //參數注釋 : 01hdc, 2:tt光線總長,3:入射弧度(非角度), 4(當前)光線入口x坐標x01;5當前光線入口Y坐標Y01; //調用例子:digui01andDrawlight(hdc, tt, 125, 190, 200); ////int digui01DrawLine01light(HDC hdc, long long tt, int rsjiaodu, int x01, int y01) int digui01Draw02Circle02light(HDC hdc, int whichCircle, long long tt, double rsHu01du01, int x01, int y01) //int digui01Draw02Circle02light(HDC hdc, int whichCircle, long long tt, double rsHu01du01, int rsjiaodu, int x01, int y01) {//int digui01andDrawlight112110 diguiAllTimes1++; printf_s("\r\nDiGuiTimes:%lld", diguiAllTimes1); // cout << "diguiAllTimes1:" << diguiAllTimes1 << endl; // printf_s("run112110Here!"); // cout << "run112110Here!" << endl; if (tt <= 1) { cout << "[tt=1?" << tt << "]" << endl; return 1; } // double rsHudu01 = ((double)rsjiaodu * 1000.0 / 180.0 / 1000.0 / 10000.0) * PI18 / 10000000000000;// 0; // double rsHudu01 = (double)rsjiaodu *PId / 180; //角度廢棄 cout << "入射01弧度:" << rsHu01du01;// << endl; cout << "{入射01角度度:" << rsHu01du01*180/PId<<"}"<<endl; // rsHudu01 = (double)rsjiaodu*3.1415926 / 180.0; printf_s("_rsHu01du01:=%f", rsHu01du01); cout << endl; // cout << "rsHudu01:=" << rsHudu01 << endl; long lightDuanlen01 = 0;//當前光線 線段長度 // for (long long ii = 0; ii < tt; ++ii) {//for1110 ++lightDuanlen01; double danweiX01 = cos(rsHu01du01); double danweiY01 = sin(rsHu01du01); double yuanShiX001 = (double)lightDuanlen01*danweiX01; double yuanShiY001 = (double)lightDuanlen01*danweiY01; // int zhenShiX0001 = (double)yuanShiX001 + x01; int zhenShiY0001 = (double)yuanShiY001 + y01; //根據真實 實際坐標,描點成線--… SetPixel(hdc, zhenShiX0001, zhenShiY0001, RGB(0, 0, 200)); //亮藍 //判斷: // int C1s_rightTimes = 0; // int C2s_leftTimes = 0; //判斷真實點的軸距 //判斷 是否 撞過 C1 圓1: //真實軸距離 long long zhenshiZhouJvliToC1XY01 = zhenShiX0001 * zhenShiX0001 + (zhenShiY0001-200) * (zhenShiY0001-200); //zhenShiX0001>=200 一定跑出了 圓1,所以是廢話(多重保險…… //2號圓的左側弧: long long zhenshiZhouJvliToC2xy02 = (300 - zhenShiX0001) * (300 - zhenShiX0001) + (zhenShiY0001 - 200) * (zhenShiY0001 - 200); if ((/*3*/zhenshiZhouJvliToC1XY01 >= 200 * 200 /*3*/) && (/*3*/zhenshiZhouJvliToC2xy02 >= (200 * 200) /*3*/)) { return 0; } ////注意這里是撞 左側大圓(1號圓)的右側弧! if /*1*/ ( (/*2*/ 1==whichCircle/*2*/) && (/*2*/ (/*3*/zhenshiZhouJvliToC1XY01>= 200*200 /*3*/) || ( zhenShiX0001 >= 200 ) /*2*/) )/*1*/ //if (/*1*/ 1 == whichCircle && zhenShiX0001 >= 200 /*1*/) {//if11a10 ++C1s_rightTimes; cout << "C1s_rightTimes:" << C1s_rightTimes << endl; long long tt1new01 = tt - ii; //算法線: double faXian1Hudu01 = PId;// -0.1; //法線弧度初始設置為PI=π3.1415926... // faXian1Hudu01 = atan((double)zhenShiY0001-200) / (zhenShiX0001 ); // faXian1Hudu01 = PId + asin((double)(200.0-zhenShiY0001 ) / (200)); //OK1 faXian1Hudu01 = atan(((double) zhenShiY0001-200) / (zhenShiX0001) ); //測試這個圓心的比率就是 (法線的)角度 if (faXian1Hudu01 < (-1 * PId)) { faXian1Hudu01 += PId; } cout << "[撞圓1的法線角(弧度:" << faXian1Hudu01 << "]"; // //畫輔助線-法線 int x01x1 = zhenShiX0001; int y01y1 = zhenShiY0001; int x02x2 = -200 * cos((double)faXian1Hudu01)+zhenShiX0001; int y02y2 = (200 * sin( -1*(double)faXian1Hudu01)+zhenShiY0001); MoveToEx(hdc, zhenShiX0001, zhenShiY0001, NULL); HPEN hPen; hPen = CreatePen(PS_SOLID, 1, RGB(0,255, 0)); // 創建一個亮綠色的法線 SelectObject(hdc, hPen); // LineTo(hdc, x02x2, y02y2); //畫法線 double rusheHudu_faxianhudu = rsHu01du01 - faXian1Hudu01; rusheHudu_faxianhudu = faXian1Hudu01-rsHu01du01; cout << "[rusheHudu_faxianhudu:" << rusheHudu_faxianhudu << "]" << endl; double rsNewHudu01 = faXian1Hudu01;// +little_cita; //faXian1Hudu01; rsNewHudu01 = PId+ rusheHudu_faxianhudu + faXian1Hudu01; // if ((-1.0*PId / 2) < rsNewHudu01 && rsNewHudu01<0 ) rsNewHudu01 = PId - rsNewHudu01; // if ((PId ) < rsNewHudu01 && rsNewHudu01 < PId*2) rsNewHudu01 = rsNewHudu01-PId; //PId - faXian1Hudu01; //PId-faXian1Hudu01;//這是 正確方向的法線 向量; //BigA2 - rsHuDu_BuJiao + 3.0/2*PId; //(PId+faXian1Hudu01)-3.0/4*Pid; // littleCeta; //3.0/4*PId+2*faXian1Hudu01 - rsHu01du01; // double rsNewHudu01 = faXian1Hudu01 + PId; //faXian1Hudu01; // PId - faXian1Hudu01; //注意這里是撞 左側大圓(1號圓)的右側弧! // int rsNewJiao1du = ceil(rsNewHudu01 * 180 / PId); // if (rsNewJiao1du < 0) rsNewJiao1du += 360; // if (rsNewJiao1du > 360) rsNewJiao1du -= 360; lightDuanlen01 = 0;// 1; if (diguiAllTimes1 < 1900) {//if diguiAllTimes1 < 1900 //判斷是否和第一個圓相撞,則切換到 第2號圓////切換 去第 1號圓的判斷(和Draw digui01Draw02Circle02light(hdc, 2, (long long)tt1new01, rsNewHudu01, zhenShiX0001, zhenShiY0001); //digui01DrawLine01light(hdc, tt1new01, rsNewJiao1du, zhenShiX0001, zhenShiY0001); }//if diguiAllTimes1 < 1950//3000//1900 else { return 2; } if (C1s_rightTimes > 2) return 1; system("pause"); }//if11a10 //根據真實 實際坐標,描點成線--… SetPixel(hdc, zhenShiX0001, zhenShiY0001, RGB(0, 200, 0)); //亮綠 //判斷 是否 撞過 C2 圓2: //真實軸距離 //2號圓的左側弧: //long long zhenshiZhouJvliToC2xy02 = (300-zhenShiX0001) * (300-zhenShiX0001) + (zhenShiY0001-200) * (zhenShiY0001-200); if /*1*/ ( (/*2*/2 == whichCircle/*2*/) && (/*2*/ (/*3*/zhenshiZhouJvliToC2xy02 >= 200 * 200 /*3*/) || ( zhenShiX0001 <= 100 ) /*2*/) )/*1*/ {//if11a10 //if (/*1*/ 2 == whichCircle && zhenShiX0001 <= 100 /*1*/) {//if11a10 ++C2s_leftTimes; cout << "C2s_leftTimes:" << C2s_leftTimes << endl; long long tt1new01 = tt - ii; //算法線: double faXian1Hudu01 = 0; // (double)-PId; //初始法線弧度為0!法線弧度為 // faXian1Hudu01 = atan((double)zhenShiY0001-200.0) / (300.0-zhenShiX0001 ); faXian1Hudu01 = asin( ((double)zhenShiY0001 - 200.0) / 200 ); cout << "圓2號左側faXian1Hudu01:" << faXian1Hudu01 << endl; // //畫輔助線-法線 int x01x1 = zhenShiX0001; int y01y1 = zhenShiY0001; int x02x2 = 200 * cos((double)faXian1Hudu01) + zhenShiX0001; int y02y2 = (200 * sin(-1 * (double)faXian1Hudu01) + zhenShiY0001); MoveToEx(hdc, zhenShiX0001, zhenShiY0001, NULL); HPEN hPen; hPen = CreatePen(PS_SOLID, 1, RGB(0, 0,128)); // 創建一個藍色的法線 SelectObject(hdc, hPen); // LineTo(hdc, x02x2, y02y2); //畫法線 double rusheHudu_faxianhudu = rsHu01du01 - faXian1Hudu01; rusheHudu_faxianhudu = faXian1Hudu01 - rsHu01du01; cout << "[rusheHudu_faxianhudu:" << rusheHudu_faxianhudu << "]" << endl; // // double rsNewHudu01 = -(double)faXian1Hudu01;// -rsHu01du01 + PId; // double rsNewHudu01 = -(double)faXian1Hudu01;// +(PId - rsHu01du01); // -rsHu01du01 + PId; cout << "撞圓2時的入射角弧度:" << rsHu01du01<<endl; double rsNewHudu01 = -(double)faXian1Hudu01;// +getRs1Hudu_andFaxianJiajiao(faXian1Hudu01, rsHu01du01); // double rsNewHudu01 = PId-(rsHu01du01 -2 * faXian1Hudu01); rsNewHudu01 = -( faXian1Hudu01 - (PId - rsHu01du01 - faXian1Hudu01)); //OK了 //;// +getHudu1bound180rad01(rsHu01du01) - faXian1Hudu01;//;;// -getHudu1bound180rad01(rsHu01du01);// +(PId - rsHu01du01); // -rsHu01du01 + PId; int rsNewJiao1du = 0;//faXian1Hudu01;//廢棄 //ceil( (double)150 * PId / 180); ////rsNewHudu01 * 180 / PId; // if (rsNewJiao1du < 0) rsNewJiao1du += 360; // if (rsNewJiao1du > 360) rsNewJiao1du -= 360; lightDuanlen01 = 0;// 1; if (diguiAllTimes1 < 1900) {//if diguiAllTimes1 < 1900 lightDuanlen01 = 1; //切去第 1號圓的判斷(和Draw cout << "[22:rsNewHudu01" << rsNewHudu01 << "]" << endl; //rsNewJiao1du廢棄 digui01Draw02Circle02light(hdc, 1, tt1new01, rsNewHudu01, zhenShiX0001, zhenShiY0001); //digui01DrawLine01light(hdc, 1, tt1new01, rsNewHudu01, rsNewJiao1du, zhenShiX0001, zhenShiY0001); }//if diguiAllTimes1 < 1950 if (C2s_leftTimes > 2) return 1; system("pause"); }//if11a10 //根據真實 實際坐標,描點成線--… SetPixel(hdc, zhenShiX0001, zhenShiY0001, getColor1RGB1(diguiAllTimes1 % 7)); //RGB(200, 0, 0)); //亮紅 }//for1110 // return 1; }//int digui01Draw02Circle02light // ``` ?期間還試用了一些其它語言完成,當然效率比c++還是差一些; ?下次右時間還可以優化,提高效率。改進方向包括: ?1、異步產生數據,最后同意繪圖顯示; ?2、用空間換時間 ?3、不再迭代…… 迭代和遞歸的優點當然是程序代碼清晰易懂、易調試、易修改。 ?不用迭代,用存儲空間(數組或鏈表等)存儲、繪制數據……效率會更高、更好些…… whatever... C++在我的 macbookpro2011(I7cpu,8G內存)上面跑已經速度足夠(快)了。 ![](https://box.kancloud.cn/d89fccb2c37a185345280d5a0fc5a18f_510x473.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看