Wednesday, May 23, 2012

FreeBSD: ports --> graphics --> epix

epix เป็นอีกหนึ่งโปรแกรม ที่ทำให้เราเขียนกราฟที่ยุ่งยากให้ง่ายเข้า แต่ งวดนี้แตกต่างจาก gnuplot ที่ว่า ต้องอาศัยเครื่องมือของ TeX เป็นหลัก นั่นก็หมายถึงว่า ผู้ใช้ ก็ต้องเป็นผู้ที่รู้เรื่อง TeX ดีพอตัว

ไปลงจาก ports ใน category graphics ครับ ชื่อก็ epix  ไม่ต้องกังวลเรื่องการใช้งาน เขามีคู่มือมาให้ในรูปแฟ้ม .pdf อ่านกันสบายๆ

Riemann
ข้อที่ถือว่าดี ควรค่าแก่การแนะนำคือ สามารถผลิต animation เล็กๆ ออกมาได้  แต่ทั้งนี้ ก็อย่างที่ว่า ผู้ใช้งานต้องมีพื้นความรู้พอตัว ไม่ว่าจะเป็นในเรื่องของการเขียนโปรแกรมด้วยภาษา C/C++ หรือ การใช้งาน LaTeX ที่ค่อนข้างยุ่งยากเอาการอยู่ เป็นเรื่องที่ ต้องมีไว้ รวมไปถึงการใช้งาน macro ยักษ์ อย่าง emacs ด้วย โดยเฉพาะอย่างยิ่ง อันหลังนี้ถือว่า เป็นหัวใจ ในการเขียนฟังก์ชั่น สำหรับผลิตกราฟที่เราต้องการออกมา แม้จะเป็น editors แต่ก็ได้รับการ ปรับ มาให้เป็นการจำเพาะแล้ว ต้องรู้จักด้วย ไม่งั้น  เอาไม่อยู่ แน่แน่

การใช้งานก็ง่าย
๑) เขียนแฟ้มสำหรับเขียนกราฟขึ้นมา ซึ่งไวยากรณ์คือ ภาษา C/C++
๒) เรียก script ที่เขาทำมาให้เพื่อมา process แฟ้มที่เขียนขึ้น
๓) เอากราฟไปใช้งาน

ตัวอย่างที่แสดงให้ดูนั้น แฟ้มในข้อ ๑) เป็นดังนี้
/* -*-ePiX-*- */
#include "epix.h"
using namespace ePiX;

P F(double t, double r, double theta)
{
  return P(r*r*Cos(2*theta),
           r*r*Cos(t)*Sin(2*theta) + r*Sin(t)*Sin(theta),
           r*Cos(theta));
}

domain R(P(0,0,0), P(1, 1.5, 1), mesh(24, 8, 32), mesh(24, 40, 80));

int main(int argc, char* argv[])
{
  if (argc == 3)
    {
      char* arg;
      double temp1, temp2;
      temp1=strtod(argv[1], &arg);
      temp2=strtod(argv[2], &arg);

      tix()=temp1/temp2;
    }

  domain R1(R.slice1(tix()));

  picture(P(-4,-4),P(4,4), "5x5in");

  begin();
  revolutions();

  grid(1,1);

  const P ctr(3.25,-3.25); // "clock" center
  bold();
  circle(ctr, 0.5);        // clock face

  line(ctr, ctr+polar(0.4, tix())); // hands
  label(ctr+polar(0.6, tix()), "$y$");

  line(ctr, ctr+polar(0.4, tix()+0.25));
  label(ctr+polar(0.6, tix()+0.25), "$w$");

  viewpoint(4,5,3);
  camera.range(20);

  line(P(0,0,0), P(3,0,0));
  line(P(0,0,0), P(0,3,0));
  line(P(0,0,0), P(0,0,2));

  plain(Red());
  plot(F, R1.resize3(0, 0.5));

  blue();
  plot(F, R1.resize3(0.5, 1));

  bold(Magenta());
  plot(F, R.slice3(0));
  plot(F, R.slice3(0.5));

  black();
  masklabel(P(3,0,0), "$x$");
  masklabel(P(0,3,0), "$y$");
  masklabel(P(0,0,2), P(-4,0), "$z=\\textrm{Re}\\,\\sqrt{x+iy}$", tr);

  end();
}

แฟ้มนี้ชื่อ riemann.flx ซึ่งเมื่อ process โดย script ที่ชื่อ flix แล้ว ก็ได้ผลที่แสดงมาให้ดูนั่นแหละ

% flix  --gif  riemann.flx

ผลลัพธ์ที่ได้ สามารถนำไปใช้งานร่วมกับ latex ได้เลย ในการผลิตเอกสารต่างๆ ที่ต้องการรูป ที่ยุ่งๆ

% epix  riemann.flx

เราจะได้แฟ้ม riemann.eepic ซึ่งมาสามารถนำไปรวมในแฟ้มที่เตรียมโดย LaTeX ได้ทันที
script ที่ให้มา เขาว่ามีอยู่ ๔ แต่เห็นใช้งานจริงตอนนี้เพียง epix, flix และ elaps  ซึ่งหากเราใช้กับแฟ้มตัวอย่าง ข้างบนนั้น ยกเว้น flix ที่ให้ผลลัพธ์มาเลยแล้ว ก็จะเป็นดั่งนี้

% epix  riemann.flx
% elaps riemann

คำสั่งสุดท้าย จะให้แฟ้ม riemann.eps ออกมาเป็นผลลัพธ์

ไม่ต้องตกอกตกใจอะไรกับสาระในแฟ้ม ขอให้ท่านลงโปรแกรม แล้วอ่านข้อความท้ายๆ ทำตามนั้น เวลาจะเขียนแฟ้ม ก็ให้กระทำผ่าน emacs ท่านก็จะได้ template มา พร้อมที่จะเติมไปทีละคำสั่ง ทีละคำสั่ง

คำสั่งที่ท่านต้องเติม ก็อยู่ระหว่าง begin();  และ  end(); นั่นหละ ค่อยๆอ่านจาก เอกสารที่เขาให้มา แล้วดูแฟ้มตัวอย่างจาก sample files ที่เขาให้มา ไม่นานนักก็คงบรรลุธรรม

พาดพิงถึง LaTeX แล้วคิดถึงเจ้าปลิวแฮะ

No comments:


View My Stats