TOP
19 เมษายน 2007, 21:49
มีใครเคยใช้โปรแกรม asymptote (http://asymptote.sourceforge.net/) บ้างรึเปล่าครับ เป็นโปรแกรมขนาดเล็กมาก ใช้วาดรูปประเภทเวกเตอร์ (ไม่ได้หมายถึงใช้้วาดเวกเตอร์นะครับ หมายถึงลักษณะภาพที่ได้ ซึ่งสามารถขยายขนาดให้ใหญ่มากๆได้โดยไม่แตก) ที่ให้ผลงานคุณภาพเยี่ยมยอด วิธีวาดต้องเขียนเป็นคำสั่งลงไป โดยสามารถเขียนฟังก์ชันขึ้นใช้งานเองได้ด้วย เพื่อให้การวาดรูปที่ซับซ้อนเป็นไปได้โดยง่าย ที่สำคัญนำมาใช้ร่วมกับ LaTeX ได้ด้วยครับ (ยังไม่ทดลองด้วยตนเอง)
ตัวอย่างภาพที่ได้จากโปรแกรม asymptote
44
และนี่คือคำสั่งที่ใช้วาดรูปด้านบน
import three;
import math;
texpreamble("\usepackage{bm}");
size(300,0);
pen thickp=linewidth(0.5mm);
real radius=0.8, lambda=37, aux=60;
currentprojection=perspective(4,1,2);
// Planes
pen bg=gray(0.9);
filldraw((1.2,0,0)--(1.2,0,1.2)--(0,0,1.2)--(0,0,0)--cycle3,bg,bg);
filldraw((0,1.2,0)--(0,1.2,1.2)--(0,0,1.2)--(0,0,0)--cycle3,bg,bg);
filldraw((1.2,0,0)--(1.2,1.2,0)--(0,1.2,0)--(0,0,0)--cycle3,bg,bg);
real r=1.5;
pen p=rgb(0,0.7,0);
draw(Label("$x$",1),O--r*X,p,Arrow);
draw(Label("$y$",1),O--r*Y,p,Arrow);
draw(Label("$z$",1),O--r*Z,p,Arrow);
label("$\rm O$", (0,0,0),W);
// Point Q
triple pQ=radius*dir(lambda,aux);
draw(O--radius*dir(90,aux),dashed);
label("$\rm Q$",pQ,N+3*W);
draw("$\lambda$",arc(O,0.15pQ,0.15*Z),N+0.3E);
// Particle
triple m=pQ-(0.26,-0.4,0.28);
real width=5;
dot("$m$",m,SE,linewidth(width));
draw("$\bm{\rho}$",(0,0,0)--m,Arrow,PenMargin(0,width));
draw("$\bm{r}$",pQ--m,Arrow,PenMargin(0,width));
// Spherical octant
real r=sqrt(pQ.x^2+pQ.y^2);
draw(arc((0,0,pQ.z),(r,0,pQ.z),(0,r,pQ.z)),dashed);
draw(arc(O,radius*Z,radius*dir(90,aux)),dashed);
draw(arc(O,radius*Z,radius*X),thickp);
draw(arc(O,radius*Z,radius*Y),thickp);
draw(arc(O,radius*X,radius*Y),thickp);
// Moving axes
triple i=dir(90+lambda,aux);
triple k=unit(pQ);
triple j=cross(k,i);
draw(Label("$x$",1),pQ--pQ+0.2*i,2W,red,Arrow);
draw(Label("$y$",1),pQ--pQ+0.32*j,red,Arrow);
draw(Label("$z$",1),pQ--pQ+0.26*k,red,Arrow);
draw("$\bm{R}$",O--pQ,Arrow);
draw("$\omega\bm{K}$",arc(0.9Z,0.2,90,-120,90,160,CW),1.2N,Arrow);
ตัวอย่างแผนภาพเวนน์-ออยเลอร์ ของเซตตั้งแต่ 3 - 6 เซต
อันนี้ในตัวอย่างที่ผมไปเจอมา มีคนเขียนเป็นฟังก์ชันให้เรียกใช้งานเลยว่า ต้องการแผนภาพเวนน์สำหรับกี่เซต แล้วโปรแกรม asymptote ก็จะวาดแผนภาพนั้นออกมาให้
45
และนี่คือคำสั่งที่ใช้วาดรูปด้านบน
// Venn diagram // Diagramme de Venn
// Edwards' construction // Construction d'Edwards
import roundedpath;
size(10cm,0);
path [] EdVenn(int n)
{
path [] opath;
if (n>=1)
opath.push(shift(-1.4,-.9)*roundedpath(xscale(2.8)*yscale(.9)*unitsquare,.1));
if (n>=2)
opath.push(shift(0,-.9)*roundedpath(xscale(1.4)*yscale(1.8)*unitsquare,.1));
if (n>=3)
opath.push(scale(.5)*unitcircle);
for (int i=1; i<=n-3; ++i)
{
pair pcle=point(opath[2],1/(2^i)),
ccle=intersectionpoint(pcle--(pcle-dir(opath[2],1/(2^i))), (0,0)--(1,0));
path cle=shift(ccle)*scale(abs(pcle-ccle))*unitcircle;
real[] p1=intersect(cle, opath[2]);
path ocle=subpath(cle,-p1[0],p1[0]);
guide tpath;
real step=360/(2^i), a=0;
for (int j=0; j<2^i; ++j)
{
tpath=tpath..rotate(a)*ocle;
a+=step;
}
opath.push(tpath..cycle);
}
return opath;
}
draw(EdVenn(6));
ก็เป็นเพียงการนำโปรแกรมที่ไปเจอมาเมื่อหลายสัปดาห์ก่อนมาแนะนำให้ทราบกัน เผื่อมีใครสนใจนำมาใช้ และหากใช้เป็นแล้วจะเขียนเป็นบทความแนะนำ การเขียนคำสั่งเบื้องต้นก็จะเป็นการดีครับ :laugh:
ตัวอย่างภาพที่ได้จากโปรแกรม asymptote
44
และนี่คือคำสั่งที่ใช้วาดรูปด้านบน
import three;
import math;
texpreamble("\usepackage{bm}");
size(300,0);
pen thickp=linewidth(0.5mm);
real radius=0.8, lambda=37, aux=60;
currentprojection=perspective(4,1,2);
// Planes
pen bg=gray(0.9);
filldraw((1.2,0,0)--(1.2,0,1.2)--(0,0,1.2)--(0,0,0)--cycle3,bg,bg);
filldraw((0,1.2,0)--(0,1.2,1.2)--(0,0,1.2)--(0,0,0)--cycle3,bg,bg);
filldraw((1.2,0,0)--(1.2,1.2,0)--(0,1.2,0)--(0,0,0)--cycle3,bg,bg);
real r=1.5;
pen p=rgb(0,0.7,0);
draw(Label("$x$",1),O--r*X,p,Arrow);
draw(Label("$y$",1),O--r*Y,p,Arrow);
draw(Label("$z$",1),O--r*Z,p,Arrow);
label("$\rm O$", (0,0,0),W);
// Point Q
triple pQ=radius*dir(lambda,aux);
draw(O--radius*dir(90,aux),dashed);
label("$\rm Q$",pQ,N+3*W);
draw("$\lambda$",arc(O,0.15pQ,0.15*Z),N+0.3E);
// Particle
triple m=pQ-(0.26,-0.4,0.28);
real width=5;
dot("$m$",m,SE,linewidth(width));
draw("$\bm{\rho}$",(0,0,0)--m,Arrow,PenMargin(0,width));
draw("$\bm{r}$",pQ--m,Arrow,PenMargin(0,width));
// Spherical octant
real r=sqrt(pQ.x^2+pQ.y^2);
draw(arc((0,0,pQ.z),(r,0,pQ.z),(0,r,pQ.z)),dashed);
draw(arc(O,radius*Z,radius*dir(90,aux)),dashed);
draw(arc(O,radius*Z,radius*X),thickp);
draw(arc(O,radius*Z,radius*Y),thickp);
draw(arc(O,radius*X,radius*Y),thickp);
// Moving axes
triple i=dir(90+lambda,aux);
triple k=unit(pQ);
triple j=cross(k,i);
draw(Label("$x$",1),pQ--pQ+0.2*i,2W,red,Arrow);
draw(Label("$y$",1),pQ--pQ+0.32*j,red,Arrow);
draw(Label("$z$",1),pQ--pQ+0.26*k,red,Arrow);
draw("$\bm{R}$",O--pQ,Arrow);
draw("$\omega\bm{K}$",arc(0.9Z,0.2,90,-120,90,160,CW),1.2N,Arrow);
ตัวอย่างแผนภาพเวนน์-ออยเลอร์ ของเซตตั้งแต่ 3 - 6 เซต
อันนี้ในตัวอย่างที่ผมไปเจอมา มีคนเขียนเป็นฟังก์ชันให้เรียกใช้งานเลยว่า ต้องการแผนภาพเวนน์สำหรับกี่เซต แล้วโปรแกรม asymptote ก็จะวาดแผนภาพนั้นออกมาให้
45
และนี่คือคำสั่งที่ใช้วาดรูปด้านบน
// Venn diagram // Diagramme de Venn
// Edwards' construction // Construction d'Edwards
import roundedpath;
size(10cm,0);
path [] EdVenn(int n)
{
path [] opath;
if (n>=1)
opath.push(shift(-1.4,-.9)*roundedpath(xscale(2.8)*yscale(.9)*unitsquare,.1));
if (n>=2)
opath.push(shift(0,-.9)*roundedpath(xscale(1.4)*yscale(1.8)*unitsquare,.1));
if (n>=3)
opath.push(scale(.5)*unitcircle);
for (int i=1; i<=n-3; ++i)
{
pair pcle=point(opath[2],1/(2^i)),
ccle=intersectionpoint(pcle--(pcle-dir(opath[2],1/(2^i))), (0,0)--(1,0));
path cle=shift(ccle)*scale(abs(pcle-ccle))*unitcircle;
real[] p1=intersect(cle, opath[2]);
path ocle=subpath(cle,-p1[0],p1[0]);
guide tpath;
real step=360/(2^i), a=0;
for (int j=0; j<2^i; ++j)
{
tpath=tpath..rotate(a)*ocle;
a+=step;
}
opath.push(tpath..cycle);
}
return opath;
}
draw(EdVenn(6));
ก็เป็นเพียงการนำโปรแกรมที่ไปเจอมาเมื่อหลายสัปดาห์ก่อนมาแนะนำให้ทราบกัน เผื่อมีใครสนใจนำมาใช้ และหากใช้เป็นแล้วจะเขียนเป็นบทความแนะนำ การเขียนคำสั่งเบื้องต้นก็จะเป็นการดีครับ :laugh: