Javított változat.
//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
//#define float1 double
#define float1 float
struct float2
{
float1 x,y;
float2() {x=y=0;};
float2(float1 x2,float1 y2) {x=x2;y=y2;}
};
float1 skalar(float2 v1,float2 v2) { return (v1.x*v2.x + v1.y*v2.y );}
float1 hossz(float2 v1) {return gyok(skalar(v1,v1));}
float2 normalt(float2 v1)
{
float1 q=hossz(v1);
v1.x/=q;
v1.y/=q;
visszater v1;
}
float1 frand(float1 n)
{
return n*(float1)(rand()%20000)/20000.0;
}
struct adat
{
float2 v1;
int tipus;
};
map<float1,adat> pontok;
void metszet(float2 &v1,float2 &v2,float2 &u1,float2 &u2,int i)
{
float2 ir1,ir2, nor,tmp,metszespont;
ir1.x=v2.x-v1.x;
ir1.y=v2.y-v1.y;
float1 h1=hossz(ir1);
ir1.x /= h1;
ir1.y /= h1;
ir2.x=u2.x-u1.x;
ir2.y=u2.y-u1.y;
float1 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;
float1 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;
float1 tav2=skalar(tmp,ir2);
if(tav2>=0.0)
if(tav2<=h2)
{
adat ad;
ad.v1=metszespont;
ad.tipus=i;
pontok[tav]=ad;
}
}
}
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],i);
metszet(v1,sarkok[i][4],sarkok[i][1],sarkok[i][2],i);
metszet(v1,sarkok[i][4],sarkok[i][3],sarkok[i][2],i);
metszet(v1,sarkok[i][4],sarkok[i][0],sarkok[i][3],i);
if(pontok.size()==0)
visszater igaz;
}
visszater hamis;
}
float1 calc(float2 v1,float2 v2,float1 k1,float1 k2)
{
int tipus1=3,tipus2=3;
for(int i=0;i<2;i++)
{
pontok.clear();
metszet(v1,sarkok[i][4],sarkok[i][0],sarkok[i][1],i);
metszet(v1,sarkok[i][4],sarkok[i][1],sarkok[i][2],i);
metszet(v1,sarkok[i][4],sarkok[i][3],sarkok[i][2],i);
metszet(v1,sarkok[i][4],sarkok[i][0],sarkok[i][3],i);
if(pontok.size()==0)
{tipus1=i;}
pontok.clear();
metszet(v2,sarkok[i][4],sarkok[i][0],sarkok[i][1],i);
metszet(v2,sarkok[i][4],sarkok[i][1],sarkok[i][2],i);
metszet(v2,sarkok[i][4],sarkok[i][3],sarkok[i][2],i);
metszet(v2,sarkok[i][4],sarkok[i][0],sarkok[i][3],i);
if(pontok.size()==0)
{tipus2=i;}
}
pontok.clear();
for(int i=0;i<2;i++)
{
metszet(v1,v2,sarkok[i][0],sarkok[i][1],i);
metszet(v1,v2,sarkok[i][1],sarkok[i][2],i);
metszet(v1,v2,sarkok[i][3],sarkok[i][2],i);
metszet(v1,v2,sarkok[i][0],sarkok[i][3],i);
}
float1 fazis=0;
adat utolso;
utolso.v1=v1;
utolso.tipus=tipus1;
float2 diff;
if(pontok.size()>0)
for(map<float1,adat>::iterator iter=pontok.begin(); iter!=pontok.end();++iter)
{
diff.x= iter->second.v1.x - utolso.v1.x;
diff.y= iter->second.v1.y - utolso.v1.y;
if(iter->second.tipus!=utolso.tipus ) fazis += hossz(diff)*k1;
else
{
if(utolso.tipus==3) fazis += hossz(diff)*k1;
else fazis += hossz(diff)*k2;
}
utolso = iter->second;
}
diff.x= v2.x - utolso.v1.x;
diff.y= v2.y - utolso.v1.y;
if(tipus2!=utolso.tipus) fazis += hossz(diff)*k1;
else
{
if(tipus2==3) 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,310);
sarkok[0][3]=float2(200,310);
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,310);
float2 cel(450,200);
int s=2,g=40;
for(int y=g;y<500-g;y+=s)
for(int x=g;x<500-g;x+=s)
{
float2 amplitudo(0,0);
float1
k1=M_PI*2.0/(0.1),
k2=M_PI*2.0/(0.12);
float1 fazis=0;
float2 kep(x,y);
int u=0;
for(int x3=-40;x3<41;x3++)
{
kep.x=x+0.5*(frand(2.0)-1.0);
kep.y=y+0.5*(frand(2.0)-1.0);
fazis = calc(forras,kep, k1,k2);
fazis += calc(kep,cel, k1,k2);
amplitudo.x += cos(fazis);
amplitudo.y += sin(fazis);
u++;
}
amplitudo.x/=(float1)u;
amplitudo.y/=(float1)u;
float1 P=skalar(amplitudo,amplitudo);
int szin=(int)(P*P*255);
if(belul(float2(x,y)))
{
szin<<=16;
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;
}