http://lfwiki.kmvs.km.edu.tw/lf/gallery/70/TriSnowFlake0710.JPG

//g++ `Magick++-config --cxxflags --cppflags` -I/usr/local/include/ImageMagick-7 segb.c `Magick++-config --ldflags --libs` -L/usr/local/zlib/lib -lz
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <Magick++.h> using namespace Magick; void drawSide(int L,int ox,int oy, int fx ,int fy,double rad,Image *pim){ //O--M--W--N--F int mx,my,nx,ny,wx,wy; pim->strokeColor("red"); int w=pow((fy-oy)*(fy-oy)+(fx-ox)*(fx-ox),0.5); int dx=w*cos(rad); int dy=-w*sin(rad); mx=ox+dx/3; my=oy+dy/3; pim->draw(DrawableLine(ox,oy,mx,my)); int w2=w/3; int dx2=w2*cos(rad+M_PI/3); int dy2=-w2*sin(rad+M_PI/3); wx=mx+dx2; wy=my+dy2; pim->strokeColor("green"); pim->draw(DrawableLine(mx,my,wx,wy)); nx=ox+2*dx/3; ny=oy+2*dy/3; pim->draw(DrawableLine(wx,wy,nx,ny)); pim->strokeColor("blue"); pim->draw(DrawableLine(nx,ny,fx,fy)); pim->strokeColor("white"); pim->draw(DrawableArc((mx+nx+wx)/3-w2/4,(my+ny+wy)/3-w2/4,(mx+nx+wx)/3+w2/4,(my+ny+wy)/3+w2/4,0,360));
if (L>0) { drawSide(L-1,ox,oy,mx,my,rad,pim); drawSide(L-1,mx,my,wx,wy,rad+M_PI/3,pim); drawSide(L-1,wx,wy,nx,ny,rad-M_PI/3,pim); drawSide(L-1,nx,ny,fx,fy,rad,pim); } } void drawTriLine(int L,int ox,int oy, int w, int h,Image *pim){ int gx,gy,fx,fy; pim->strokeColor("red"); fx=ox+w*cos(M_PI/3); fy=oy-w*sin(M_PI/3); gx=ox+w; gy=oy; printf("O(%d,%d) w=%d,h=%d\n",ox,oy,w,h); printf("1:(%d,%d)-(%d,%d)\n",ox,oy,fx,fy); pim->draw(DrawableLine(ox,oy,fx,fy)); printf("2:(%d,%d)-(%d,%d)\n",fx,fy,gx,gy); pim->draw(DrawableLine(fx,fy,gx,gy)); printf("3:(%d,%d)-(%d,%d)\n",gx,gy,ox,oy); pim->draw(DrawableLine(gx,gy,ox,oy)); drawSide(4,ox,oy,fx,fy,M_PI/3,pim); drawSide(4,fx,fy,gx,gy,-M_PI/3,pim); drawSide(4,gx,gy,ox,oy,-M_PI,pim); pim->draw(DrawableArc((ox+fx+gx)/3-w/4,(oy+fy+gy)/3-w/4,(ox+fx+gx)/3+w/4,(oy+fy+gy)/3+w/4,0,360));
}
void drawTri(int L,int ox,int oy, int w, int h,Image *pim){ int ax,ay; pim->strokeColor("white"); pim->draw(DrawableLine(ox+0,oy+h-1,ox+w,oy+h-1)); pim->draw(DrawableLine(ox+0,oy+h-1,ox+w*sin(M_PI/6),oy+h-1-w*cos(M_PI/6))); pim->draw(DrawableLine(ox+w,oy+h-1,ox+w*sin(M_PI/6),oy+h-1-w*cos(M_PI/6))); if(L>0){ ax=ox+3*w/6; ay=oy+h-1-w*cos(M_PI/6)/3-w/3; drawTri(L-1,ax,ay,w/3,w/3,pim); ax=ox+w/6; ay=oy+h-1-w*cos(M_PI/6)*1/3-w/3; drawTri(L-1,ax,ay,w/3,w/3,pim); ax=ox+w/3; ay=oy+h-1-w*cos(M_PI/6)*2/3-w/3; drawTri(L-1,ax,ay,w/3,w/3,pim); ax=ox+0*w/3; ay=oy+h-1-w/3; drawTri(L-1,ax,ay,w/3,w/3,pim); ax=ox+1*w/3; ay=oy+h-1-w/3; drawTri(L-1,ax,ay,w/3,w/3,pim); ax=ox+2*w/3; ay=oy+h-1-w/3; drawTri(L-1,ax,ay,w/3,w/3,pim); } }
int main() { int w=3*7*5*10; int h=3*7*5*14; Image im( Geometry(w, h), Color("black")); im.draw(DrawableStrokeColor(Color("black"))); im.strokeWidth(2); drawTriLine(3,0,w,w,w,&im); im.write("TriSnowFlake-1.jpg"); } |