Mình không học về lập trình nhưng trong quá trình giải bài tập nảy sinh chút vấn đề và mình nghĩ giải quyết bằng lập trình sẽ tốt hơn nên mình vừa học C++ trong 1 tuần và viết chương trình sau nhưng chạy không ra kết quả.
Mình hi vọng các bạn có thể giúp mình tìm lỗi sai trong thuật toán ở chương trình sau, mình chưa hoàn thiện hoàn toàn chương trình, chỉ đang chạy thử xem thuật toán có chính xác hay không, chương trình không báo lỗi nhưng không cho ra kết quả. Xin chân thành cảm ơn!
#include <iostream>
#include <cmath>
#define PI 3.14159
using namespace std;
struct Point{
double x = 0.0;
double y = 0.0;
} A, B, C, D, E, F, G;
struct Normal{
double xn;
double yn;
} n, n1;
struct Line{
double a;
double b;
double c;
} AB, BC, AC, EF, DF;
void prisma(double L, double l, double beta, double alpha){
A.x = 0.0;
A.y = L*tan(beta);
B.x = -L;
B.y = 0.0;
C.x = L;
C.y = 0.0;
D.x = -l;
D.y = 0.0;
E.x = l;
E.y = 0.0;
F.x = 0.0;
F.y = l*tan(alpha);
}
void Equa(Line t, Point X, Point Y){//phương trình đt
n.xn = -(Y.y - X.y);
n.yn = Y.x - X.x;
t.a = n.xn;
t.b = n.yn;
t.c = -(n.xn*X.x + n.yn*X.y);
}
double Length(Point X, Point Y){ // độ dài đoạn th
return sqrt(pow(X.x-Y.x,2)+pow(X.y-Y.y,2));
}
void PofInters(Line t, Line k){ //tìm điểm phản xạ
double d, dx, dy;
d = t.a*k.b - k.a*t.b;
dx = t.c*k.b - k.c*t.b;
dy = t.a*k.c - k.a*t.c;
G.x = dx/d;
G.y = dy/d;
}
bool Middle(Point X, Point Y, Point G){// kiểm tra
//nằm giữa
if ((Length(X, G) + Length(Y, G)) == length(Point X, diem Y))
return true;
}
void Angle(Line t, Line k){ //tính góc phản xạ
double gamma = acos(abs(t.a*k.a + t.b*k.b)/(sqrt(t.a*t.a + t.b*t.b)*sqrt(k.a*k.a + k.b*k.b)));
if (gamma < PI/2) gamma = PI/2 - gamma;
else gamma = gamma - PI/2;
}
void Normal1(double Angle1, Line t){ //pháp tuyến //mới
n1.xn = sqrt(t.a*t.a + t.b*t.b)*cos(Angle1 + atan(t.a/t.b));
n1.yn = sqrt(t.a*t.a + t.b*t.b)*sin(Angle1 + atan(t.a/t.b));
}
void equaNorm(Line t, Normal n1, Point G){//pt tia //phản xạ
t.a = n1.xn;
t.b = n1.yn;
t.c = -(n1.xn*G.x + n1.yn*G.y);
}
double Distan(Point G){// khoảng cách từ điểm //thoát của tia laser đến cạnh đáy BC
return abs(BC.a*G.x + BC.b*G.y + BC.c)/sqrt(BC.a*BC.a + BC.b*BC.b);
}
int main() {
double L, l;
int m = 0, j = 0;
cout <<"Вводите значение L: ";
cin >> L; cout << endl;
cout <<"Вводите значение l: ";
cin >> l; cout << endl;
for(double beta = (PI/2)*1/9; beta <= (PI/2)*7/9; beta =+ PI/1800){
for(double alpha = 0; alpha <= PI/2; alpha =+ PI/1800) {
Prisma(L,l,beta,alpha);
Equa(AB,A,B);
Equa(BC,B,C);
Equa(AC,A,C);
Equa(EF,E,F);
Equa(DF,D,F);
Line t;
t.a=5.0;
t.b = t.c = 0.0;
Pofinters(t, EF);
double r = asin(sin(alpha)/1.5);
Normal1((alpha - r), t);
equaNorm(t, n1, G);
PofInters(t, AC);
double gamma = 0.0, teta = 0.0;
if (Middle(A, C, G) == true){
Angle(t, AC);
m++;
}
while(abs(1.5*sin(gamma) - sin(PI/2 - beta)) > 0.001){
if((G.x =! 0) && (G.y =! 0) && (gamma < asin(1/1.5))){
teta = asin(1.5*sin(gamma));
}
Norml1(gamma*2, t);
equaNorm(t, n1, G);
PofInters(t,AB);
if(Middle(A,B,G) == true){
Angle(t,AB);
m++;
}
else {
PofInters(t,BC);
if((Middle(B,D,G) == true) && (Middle(E,C,G) == true)){
Angle(t,BC);
m++;
}
else{
PofInters(t,AC);
if(Middle(A,C,G) == true){
Angle(t,AC);
m++;
}
}
}
}
if(abs(1.5*sin(gamma) == sin(PI/2 - beta)) < 0.001) j++;
}
}
cout<<j;
return 0;
}