画一幅大鹅

mac2025-06-09  43

用processing画一幅自画像,实现动态的交互。

实验要求:创意自画像,用编程方式创作一幅介绍自己的作品

交互1.鼠标点击,以点击的点为圆心,在周围生成六个小花瓣,颜色随机。 交互2:鹅的笑容会鼠标点击而不一样,有两种状态,在两种状态之间切换。 鹅带的蝴蝶结是用一张贴图贴上去的。

画鹅嘴时是以一个目标点,以他为中心去计算周围的Bezier曲线,笑容的不同方式,是用Bezier曲线起点和终点一样,但控制点不一样。弯曲度也不一样。 点击一下产生一朵小花,鼠标点击的点为圆心,计算角度,生成六个颜色随机的小三角形。

PImage staticImg; void setup() { size(600, 600,P2D); background(255); staticImg = loadImage("hudiejie2.jpg"); //fillcolor(); } int smileflag=0; void draw() { int Millis = millis(); float t = millis()/1000; /// //print goose goose(); //fillcolor(); } void goose() { smooth(); noFill(); strokeWeight(6); stroke(0); /// //head arc(300,350,600,600,radians(230),radians(310)); arc(543.5,300,950,950,radians(100),radians(202)); arc(55,300,950,950,radians(-22.2),radians(90)); /// //eyes_one strokeWeight(4); float eye_height=300+475*sin(radians(202))+20; float eye_x1=543.5+475*cos(radians(202))+30; float h=80; float m=10; line(eye_x1,eye_height,eye_x1+h,eye_height); //ellipse(eye_x1+h/2,eye_height,h,50); arc(eye_x1+h/2,eye_height,h,50,0,PI); line(eye_x1+h-m,eye_height-m,eye_x1+h+m,eye_height+m); fill(0); ellipse(eye_x1+h/2,eye_height+12.5,h/2,50/2); //eyes_two float eye_x2=55+475*cos(radians(-22.2))+30-140; fill(255); arc(eye_x2+h/2,eye_height,h,50,0,PI); line(eye_x2,eye_height,eye_x2+h,eye_height); line(eye_x2-m,eye_height+m,eye_x2+m,eye_height-m); fill(0); ellipse(eye_x2+h/2,eye_height+12.5,h/2,50/2); //mouse / float mouse_y=eye_height+90; float mouse_x=(eye_x1+h+eye_x2)/2; stroke(255,185,15); line(mouse_x,mouse_y,mouse_x-30,mouse_y-40); line(mouse_x,mouse_y,mouse_x+30,mouse_y-40); //triangle(mouse_x,mouse_y,mouse_x-30,mouse_y-40,mouse_x+30,mouse_y-40); // line(mouse_x-30,mouse_y-40,mouse_x+30-250*sin(radians(38)),mouse_y-40+250*cos(radians(38))); //fill(255); fill(255); stroke(255,185,15); beginShape(); bezier(mouse_x-30,mouse_y-40, mouse_x-30,mouse_y-20, mouse_x-30-250*sin(radians(33))+20,mouse_y-40+250*cos(radians(33)), mouse_x-30-250*sin(radians(33)),mouse_y-40+250*cos(radians(33))); //line(mouse_x+30,mouse_y-40,mouse_x+30+250*sin(radians(33)),mouse_y-40+250*cos(radians(33))); fill(255); stroke(255,185,15); bezier(mouse_x+30,mouse_y-40, mouse_x+30,mouse_y-20, mouse_x+30+250*sin(radians(33))-20,mouse_y-40+250*cos(radians(33)), mouse_x+30+250*sin(radians(33)),mouse_y-40+250*cos(radians(33))); float x1=(mouse_x-30-250*sin(radians(33))+mouse_x+30+250*sin(radians(33)))/2; float y1=mouse_y-40+250*cos(radians(33)); float mouse_weight=mouse_x+30+250*sin(radians(33))-(mouse_x-30-250*sin(radians(33))); arc(x1,y1,mouse_weight,50,0,PI); fill(205,149,12); arc(x1,y1+20,mouse_weight/2,70,PI,2*PI); endShape(); stroke(255,255,255); beginShape(); texture(staticImg); vertex(150, 500, 0, 0); vertex(450, 500, 584, 0); vertex(450, 600, 584, 453); vertex(150, 600, 0, 453); endShape(CLOSE); } void goose_smile(float mouse_x,float mouse_y) { //smile if(smileflag==0) { fill(255); stroke(255,185,15); bezier(mouse_x-30-250*sin(radians(33)),mouse_y-10+250*cos(radians(33)), mouse_x-250*sin(radians(33)),mouse_y+60+250*cos(radians(33)), mouse_x+250*sin(radians(33)),mouse_y+60+250*cos(radians(33)), mouse_x+30+250*sin(radians(33)),mouse_y-10+250*cos(radians(33)) ); } if(smileflag==1) { fill(255); stroke(255,185,15); bezier(mouse_x-30-250*sin(radians(33)),mouse_y-10+250*cos(radians(33)), mouse_x-250*sin(radians(33)),mouse_y+20+250*cos(radians(33)), mouse_x+250*sin(radians(33)),mouse_y+20+250*cos(radians(33)), mouse_x+30+250*sin(radians(33)),mouse_y-10+250*cos(radians(33)) ); } } //MouseDown void mouseClicked() { //fill(0); int t=second(); fireworkers(mouseX,mouseY); if(smileflag==0) smileflag=1; else smileflag=0; float h=80; float m=10; float eye_x2=55+475*cos(radians(-22.2))+30-140; float eye_height=300+475*sin(radians(202))+20; float eye_x1=543.5+475*cos(radians(202))+30; float mouse_y=eye_height+90; float mouse_x=(eye_x1+h+eye_x2)/2; goose_smile(mouse_x,mouse_y); } void fireworkers(float x,float y) { int t=second(); float theta=radians(60+10*t); for(int i=0;i<6;i++) { float theta1=theta+10; float theta2=theta-10; //point1 float x1=x+10*cos(radians(theta)); float y1=y+10*sin(radians(theta)); //point2 float x2=x+15*cos(radians(theta1)); float y2=y+15*sin(radians(theta1)); //point3 float x3=x+15*cos(radians(theta2)); float y3=y+15*sin(radians(theta2)); //color colorMode(RGB, 255); int R=int(random(0, 255)); int G=int(random(0, 255)); int B=int(random(0, 255)); stroke(R,G,B); fill(R,G,B); triangle(x1,y1,x2,y2,x3,y3); theta=theta+60; } } // fill(255,185,15); //fillcolor(307,296); void fillcolor() { stroke(255,185,15); point(300,228); int l=10; //int y=228; for(int y=228;y<320;y=y+1) { line(300,y,300+l,y); l=l+10; } }
最新回复(0)