PDA

View Full Version : โปรแกรม asymptote


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:

warut
20 เมษายน 2007, 02:27
ไม่เคยรู้จักมาก่อนครับ แต่เชื่อแล้วว่าสุดยอดจริงๆ ขอบคุณที่แนะนำครับ

ป.ล. คุณ TOP เคยลองใช้มันวาดรูป สิ่งที่เกิดจากการตัดกันของทรงกลม 8 อัน ในโจทย์ข้อนี้ (http://www.mathcenter.net/forum/showthread.php?t=2453)รึยังครับ อยากรู้ว่าหน้าตามันเป็นไง จินตนาการไม่ออกเลยครับ

TOP
20 เมษายน 2007, 16:12
ยังเลยครับ ผมยังใช้คำสั่งในโปรแกรมนี้ไม่เป็น คงต้องรอผมกลับจากเที่ยวภูเก็ตก่อนละครับ จะได้มีเวลาศึกษาเพิ่มเติม :p

อ้อ ดูผลงานเพิ่มเติมของโปรแกรม asymptote ได้ที่หน้า gallery (http://piprim.tuxfamily.org/asymptote/) :)