sat3 Creative Commons License 2012.09.08 0 0 824

Tessék. Egyébként jó szrul választottad meg a szögeket. Majdnem merőlegesen esik be a fény, úgy meg nem törik meg.

Gratulálok az óriási geometriai tudásodhoz.

 

És ez még mindig csak egy egyszerűsített eljárás. Ezért nem tökéletes az eredmény,

 

 

 

//g++ x.cpp -lX11


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <X11/Xlib.h>


#include <map>
using namespace std;


#define igaz true
#define hamis false
#define visszater return



Display *dpy;
Window win;
GC gc;

void pont(int x,int y,int szin)
{
    XSetForeground(dpy,gc,szin);
    XDrawPoint(dpy, win, gc, x,y);
}
void vonal(int x1,int y1,int x2,int y2,int szin)
{
    XSetForeground(dpy,gc,szin);
    XDrawLine(dpy, win, gc, x1,y1, x2,y2);
}


#define gyok sqrt



struct float2
{
float x,y;

float2() {x=y=0;};
float2(float x2,float y2) {x=x2;y=y2;}
};

float skalar(float2 v1,float2 v2) { return (v1.x*v2.x + v1.y*v2.y );}

float hossz(float2 v1) {return gyok(skalar(v1,v1));}

float2 normalt(float2 v1)
{
    float q=hossz(v1);
    v1.x/=q;
    v1.y/=q;
    visszater v1;
}





map<float,float2> pontok;

void metszet(float2 &v1,float2 &v2,float2 &u1,float2 &u2)
{
    float2 ir1,ir2, nor,tmp,metszespont;


    ir1.x=v2.x-v1.x;
    ir1.y=v2.y-v1.y;
    float h1=hossz(ir1);    
    ir1.x /= h1;
    ir1.y /= h1;
    
    ir2.x=u2.x-u1.x;
    ir2.y=u2.y-u1.y;
    float h2=hossz(ir2);    
    ir2.x /= h2;
    ir2.y /= h2;
    nor.x= ir2.y;
    nor.y=-ir2.x;    



    tmp.x=v1.x-u1.x;//u1
    tmp.y=v1.y-u1.y;
    float tav= (0.0- skalar(tmp,nor)) / skalar(ir1,nor);
    if(tav>=0.0)
    if(tav<=h1)
    {
        metszespont.x = v1.x + ir1.x*tav;
        metszespont.y = v1.y + ir1.y*tav;
        
        tmp.x = metszespont.x - u1.x;
        tmp.y = metszespont.y - u1.y;
        float tav2=skalar(tmp,ir2);
        
        if(tav2>=0.0)
        if(tav2<=h2)
        {
            pontok[tav]=metszespont;
        }
    }
}
float2 sarkok[2][5];

bool belul(float2 v1)
{
    for(int i=0;i<2;i++)
    {
        pontok.clear();
        metszet(v1,sarkok[i][4],sarkok[i][0],sarkok[i][1]);
        metszet(v1,sarkok[i][4],sarkok[i][1],sarkok[i][2]);
        metszet(v1,sarkok[i][4],sarkok[i][3],sarkok[i][2]);
        metszet(v1,sarkok[i][4],sarkok[i][0],sarkok[i][3]);
        if(pontok.size()==0)
                        visszater igaz;
    }
    visszater hamis;
}

float calc(float2 v1,float2 v2,float k1,float k2)
{
    int belul1=0,belul2=0;
    
    for(int i=0;i<2;i++)
    {
        pontok.clear();
        metszet(v1,sarkok[i][4],sarkok[i][0],sarkok[i][1]);
        metszet(v1,sarkok[i][4],sarkok[i][1],sarkok[i][2]);
        metszet(v1,sarkok[i][4],sarkok[i][3],sarkok[i][2]);
        metszet(v1,sarkok[i][4],sarkok[i][0],sarkok[i][3]);
        if(pontok.size()==0)
                        belul1|=1;
        pontok.clear();
        metszet(v2,sarkok[i][4],sarkok[i][0],sarkok[i][1]);
        metszet(v2,sarkok[i][4],sarkok[i][1],sarkok[i][2]);
        metszet(v2,sarkok[i][4],sarkok[i][3],sarkok[i][2]);
        metszet(v2,sarkok[i][4],sarkok[i][0],sarkok[i][3]);
        if(pontok.size()==0)
                        belul2|=1;
    }
    
    int masodik=0;
    pontok.clear();
    for(int i=0;i<2;i++)
    {
        metszet(v1,v2,sarkok[i][0],sarkok[i][1]);
        metszet(v1,v2,sarkok[i][1],sarkok[i][2]);
        metszet(v1,v2,sarkok[i][3],sarkok[i][2]);
        metszet(v1,v2,sarkok[i][0],sarkok[i][3]);
        
        masodik=pontok.size();
    }


    
    int szamlalo=1;
    float fazis=0;
    float2 utolso=v1;
      float2 diff;
      
    
        
        if(pontok.size()>0)
        for(map<float,float2>::iterator iter=pontok.begin(); iter!=pontok.end();++iter)
        {
            diff.x= iter->second.x - utolso.x;
            diff.y= iter->second.y - utolso.y;
    
            if(szamlalo==1&&belul1==0||masodik==szamlalo-1) fazis += hossz(diff)*k1;
            else                       fazis += hossz(diff)*k2;
            szamlalo++;
            utolso = iter->second;
        }
           diff.x= v2.x - utolso.x;
           diff.y= v2.y - utolso.y;
        if(belul2==0) fazis += hossz(diff)*k1;
        else           fazis += hossz(diff)*k2;

       
    visszater fazis;
}



int main()
{
 
dpy = XOpenDisplay(0);
win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0,0, 600, 600, 0,0,0);

XSelectInput(dpy, win, StructureNotifyMask);
XMapWindow(dpy, win);
gc = XCreateGC(dpy, win, 0, 0);

for(;;) { XEvent e; XNextEvent(dpy, &e); if (e.type == MapNotify) break; }



    sarkok[0][0]=float2(210,250);
    sarkok[0][1]=float2(390,250);
    sarkok[0][2]=float2(400,300);
    sarkok[0][3]=float2(200,300);

    sarkok[0][4].x=(sarkok[0][0].x+sarkok[0][1].x+sarkok[0][2].x+sarkok[0][3].x)/4.0;
    sarkok[0][4].y=(sarkok[0][0].y+sarkok[0][1].y+sarkok[0][2].y+sarkok[0][3].y)/4.0;
    
    
    sarkok[1][0]=float2(300,180);
    sarkok[1][1]=float2(400,180);
    sarkok[1][2]=float2(390,240);
    sarkok[1][3]=float2(310,240);

    sarkok[1][4].x=(sarkok[1][0].x+sarkok[1][1].x+sarkok[1][2].x+sarkok[1][3].x)/4.0;
    sarkok[1][4].y=(sarkok[1][0].y+sarkok[1][1].y+sarkok[1][2].y+sarkok[1][3].y)/4.0;
    


    float2 tmp;
    float2 forras(150,290);
    float2    cel(450,220);
    tmp.x = cel.x - forras.x;
    tmp.y = cel.y - forras.y;
    tmp=normalt(tmp);
    float q=tmp.x;tmp.x=tmp.y;tmp.y=-q;



int s=2,g=50;
for(int y=g;y<500-g;y+=s)
for(int x=g;x<500-g;x+=s)
{
    float2 amplitudo(0,0);
    float
        k1=M_PI*2.0/(0.1),
        k2=M_PI*2.0/(0.15);
    float fazis=0;
    float2 kep(x,y);

    
    int u=0;
 
     for(int x3=-10;x3<11;x3++)
    {
        kep.x=x+tmp.x*0.02*x3;            
        kep.y=y+tmp.y*0.02*x3;

        fazis =  calc(forras,kep, k1,k2);
        fazis += calc(cel,kep,    k1,k2);

        amplitudo.x += cos(fazis);
        amplitudo.y += sin(fazis);
        u++;
    }

    amplitudo.x/=(float)u;
    amplitudo.y/=(float)u;
    
    float P=skalar(amplitudo,amplitudo);
    int szin=(int)(P*P*255);
    if(belul(kep))
    {
        szin*=256*256;
        szin+=0x002000;
    }
    
    for(int y2=0;y2<s;y2+=1)
    for(int x2=0;x2<s;x2+=1)
        pont(x+x2,y+y2,szin);
}


vonal(forras.x,forras.y-5,forras.x,forras.y+5,0xffffff);
vonal(forras.x-5,forras.y,forras.x+5,forras.y,0xffffff);
vonal(cel.x,cel.y-5,cel.x,cel.y+5,0xffffff);
vonal(cel.x-5,cel.y,cel.x+5,cel.y,0xffffff);


XFlush(dpy);
getchar();

return 0;
}

Előzmény: Aparadox (810)