C++实现均匀照明的自由曲面设计

来源:互联网 发布:创维酷开内置软件卸载 编辑:程序博客网 时间:2024/05/16 14:39

当光线通过自由曲面时,可以实现一定距离处的照射物处于均匀照明状态,由于刚开始编辑,有很多粗糙的地方,欢迎讨论

公式没有给出,对于计算可以去网上找,本文给出了用c++实现的方法。



QQ:852063127

#include<iostream>#include<cmath>#include<iomanip>using namespace std;double   const   PI = acos(double(-1));int main(){    int N=800 ;//光通量划分成800份    int H=1000 ;//点光源距地面的高度    double n=1.49386 ;//折射int a=60;//发散角    double alpha = a* PI/180;    double R = H*tan(alpha);    double* cita = new double[N + 2];    double* r = new double[N + 2];    double temp;    int t = 0;    cita[1] = 0;    r[1] = 0;        for (int i = 1; i <= N + 1; i++)    {        r[i + 1] = sqrt(r[i] * r[i] + R*R / N);        temp = sin(cita[i]);        cita[i + 1] = asin(sqrt(temp*temp + 1.0 / N));    }double h = 20;    double x;double Ix,Iy;double ox,oy;double nx,ny;    for(int j = 1;j <=N + 1 ; j++)    {        x=h*tan(cita[j]);        Ix=x/sqrt(x*x+h*h);        Iy=h/sqrt(x*x+h*h);        ox=(r[j]-x)/sqrt((r[j]-x)*(r[j]-x)+(H-h)*(H-h));        oy=(H-h)/sqrt((r[j]-x)*(r[j]-x)+(H-h)*(H-h));        nx=(ox-n*Ix)/sqrt(n*n-2*n*(Ix*ox+Iy*oy)+1);        ny=(oy-n*Iy)/sqrt(n*n-2*n*(Ix*ox+Iy*oy)+1);        cout<<scientific<<setprecision(7)<<x<<" "<<0<<" "<<h<<endl;        h=h*((nx*tan(cita[j])+ny)/(nx*tan(cita[j+1])+ny));    }system("pause");    return 0;}

原创粉丝点击