week6

problem 1 


void smooth(Vec2d* vv, int num, float weight){

glColor3f(1,1,1);
glBegin(GL_LINE_STRIP);
for(int i=0;i<num;i++){
glVertex2f(vv[i].x,vv[i].y);
}
glEnd();

glColor3f(1,0,0);
glBegin(GL_LINE_STRIP);
glVertex2f(vv[0].x,vv[0].y);
for(int i=1;i<num-1;i++){
//glVertex2f(vv[i].x,vv[i].y);
Vec2d s;
s=vv[i-1]*(1-weight)/2 +vv[i]*weight +vv[i+1]*(1-weight)/2;
glVertex2f(s.x,s.y);
}
glVertex2f(vv[num-1].x,vv[num-1].y);
glEnd();

}

void drawProblem1(){

Vec2d v[]={Vec2d(0,0),Vec2d(100,100),Vec2d(200,50),Vec2d(300,200),Vec2d(400,300),Vec2d(500,100),Vec2d(600,500),Vec2d(700,300)};

//smooth(v, 8,mouseX/windowW);
smooth(pointList, numPoints,0.001);

}

problem 2

void drawProblem2(){

float r=30;
Vec2d circle[360];
Vec2d points[]={Vec2d(10,10),Vec2d(30,50),Vec2d(100,400),Vec2d(300,10),Vec2d(600,400),Vec2d(200,500),Vec2d(500,350),Vec2d(450,60),Vec2d(150,300),Vec2d(700,300)};
float weight[]={3,9,1,4,5,6,2,3,6,3};
Vec2d A(100,100);

glColor3f(1,1,1);
glBegin(GL_LINE_STRIP);

for(int i=0;i<360;i++){
circle[i]=Vec2d(mouseX+cos(2*PI*i/360)*r,mouseY+sin(2*PI*i/360)*r);
}

for(int i=0;i<360;i++){
for(int j=0;j<10;j++){
Vec2d v=circle[i]-points[j];
v.normalize();
//v=v*100;
float d=v.length();
v=v*10*weight[j]/d;
circle[i]=circle[i]+v;

}
glVertex2f(circle[i].x ,circle[i].y);
}
glEnd();



for(int i=0;i<10;i++){
glPointSize(weight[i]);
glBegin(GL_POINTS);
glVertex2f(points[i].x,points[i].y);
glEnd();
}

}

 

problem 3

void drawProblem3(){

Vec2d P0a;
Vec2d P0b;
Vec2d P1a;
Vec2d P1b;
float x;
float y;
float tt;
glColor3f(1,1,1);
glBegin(GL_LINE_STRIP);
for(int i=1;i<numPoints;i++){
glVertex2f(pointList[i].x,pointList[i].y);
}
glEnd();

//glBegin(GL_LINE_STRIP);
for(int i=1;i<numPoints;i++){
//glVertex2f(pointList[i].x,pointList[i].y);
for(int j=1;j<numPoints;j++){
P0a= Vec2d(pointList[i].x,pointList[i].y);
P0b= Vec2d(pointList[i-1].x,pointList[i-1].y);
//P1a= Vec2d(pointList[numPoints-2].x,pointList[numPoints-2].y);
//P1b= Vec2d(pointList[numPoints-1].x,pointList[numPoints-1].y);
P1a= Vec2d(pointList[j].x,pointList[j].y);
P1b= Vec2d(pointList[j-1].x,pointList[j-1].y);

float M0=(P0b.y-P0a.y)/(P0b.x-P0a.x);
float M1=(P1b.y-P1a.y)/(P1b.x-P1a.x);

x= P1a.y-P0a.y - P1a.x*M1 + P0a.x*M0;
x/=(M0-M1);
y=P0a.y+(x-P0a.x)*M0;

float left0=min(P0a.x,P0b.x);
float right0=max(P0a.x,P0b.x);
float top0=min(P0a.y,P0b.y);
float bottom0=max(P0a.y,P0b.y);

float left1=min(P1a.x,P1b.x);
float right1=max(P1a.x,P1b.x);
float top1=min(P1a.y,P1b.y);
float bottom1=max(P1a.y,P1b.y);

if(x>=left0 && x<right0 && x> left1 && x < right1){
tt=j;
glColor3f(1,0,0);
glPointSize(10);
//glBegin(GL_POINTS);
glBegin(GL_TRIANGLE_FAN);
glVertex2f(x,y);
for(int k=i;k<j;k++){

glVertex2f(pointList[k].x,pointList[k].y);
}

//glVertex2f(x,y);
glEnd();
}else{
//glColor3f(1,0,0);
}
}

}

}