그래픽 api(line,rect,arch...) 구현에 관해....

snowavalanch의 이미지

line,rect,arch, 등등....
직접 구현을 하려는데, 어려운 점이 많습니다.

여기에 관련한 내용을 볼 수 있는 곳이 있나요? 아님 책이라도.....
(최적화된 내용으로요....)

구글에서 서치를 해도 좀처럼 찾기가 어렵네요...

mrchu의 이미지

Copmuter Graphics Principles and Practice
by Foley

rOseria의 이미지

선그리기 등의 프로그램은 저 위의 책에 잘 나와있지만, 좀 더 최적화 된 것을 찾으실려면 웹서핑을 하셔야 할 듯 합니다.

예전에 2D그래픽 수업할 때 DDA 알고리즘과 Bresenham 알고리즘을 배우긴 했지만, 웹서핑 해보니까 그보다 더 빠른 알고리즘도 꽤 되더군요. 다른 것도 마찬가지가 아닐까 생각합니다.

:lol:

----
한 발자국, 한 발자국 - 언젠가는 도약하리라 ~

maidland의 이미지

콘솔상에서만 쓰실껍니까? 만약GUI방식으로 사용하실려면 GDK를 이용해보세요^^

>> http://ragnarok.co.kr <<

라그온+ㅁ+ 댄서는 아직 죽지 않았다!!
=-=-=-=-=-=-=-=-=-=-=-

익명 사용자의 이미지

이것만 이해할수 있다면 다 그릴수 있습니다.
전체 소스를 보여드리고 싶지만 방대한 이유로 핵심만 공개합니다.

이것은 실제로 베지어 곡선을 그리는 재귀적 방식인데
이것을 4분할로 그리면 원이 되고 중심점이 양쪽 끝점의 중앙에 위치하면
직선이 되며 3개의 점이 한곳에 모이면 점이 되고
중심점이 양쪽 끝점의 중앙이 아닌 곳에 있으면 그에 가까워지는 베지어 곡선이
됩니다.
재귀적 단계는 16단계까지만 했으며 더 이상은 최적화에 문제가 있습니다.
그리고 설마 해상도를 2000x2000이상 사용하시는 분은 없을테니까....

점 찍는것은 어떻게 하는지 아실거라 생각되며.....

#define DEF_Bezier_Constant0 (2.0)
void MZ_DFB_Bezier_(t_DFB *s_Handle, int s_Color, float *s_x, float *s_y)
{
 float s_fx[3], s_fy[3], s_ix[3], s_iy[3];
 s_fx[0] = ((s_x[1]  + s_x[0] ) / DEF_Bezier_Constant0)  , s_fy[0] = ((s_y[1]  + s_y[0] ) / DEF_Bezier_Constant0);
 s_fx[2] = ((s_x[2]  + s_x[1] ) / DEF_Bezier_Constant0)  , s_fy[2] = ((s_y[2]  + s_y[1] ) / DEF_Bezier_Constant0);
 s_fx[1] = ((s_fx[2] + s_fx[0]) / DEF_Bezier_Constant0)  , s_fy[1] = ((s_fy[2] + s_fy[0]) / DEF_Bezier_Constant0);
 if(((int)s_fx[0] == (int)s_fx[2] && (int)s_fy[0] == (int)s_fy[2]))MZ_DFB_DrawPixel(s_Handle, s_Color, (int)s_fx[1], (int)s_fy[1]);
 else
 {
  s_ix[0] = s_x[0] , s_iy[0] = s_y[0];
  s_ix[1] = s_fx[0], s_iy[1] = s_fy[0];
  s_ix[2] = s_fx[1], s_iy[2] = s_fy[1];
  MZ_DFB_Bezier_(s_Handle, s_Color, &s_ix[0], &s_iy[0]); 
  s_ix[0] = s_fx[1], s_iy[0] = s_fy[1];
  s_ix[1] = s_fx[2], s_iy[1] = s_fy[2];
  s_ix[2] = s_x[2] , s_iy[2] = s_y[2];
  MZ_DFB_Bezier_(s_Handle, s_Color, &s_ix[0], &s_iy[0]); 
 }
} 

void MZ_DFB_Bezier(t_DFB *s_Handle, int s_Color, int *s_x, int *s_y)
{
 float s_fx[3], s_fy[3];
 int s_Count;
 for(s_Count = 0;s_Count < 3;s_Count++)s_fx[s_Count] = (float)s_x[s_Count], s_fy[s_Count] = (float)s_y[s_Count];
 MZ_DFB_Bezier_(s_Handle, s_Color, &s_fx[0], &s_fy[0]);
}

이것은 위의 소스를 응용한 직선(사선) 그리기를 구현한겁니다.

static void __DrawLine__(int s_Color, float s_x1, float s_y1, float s_x2, float s_y2, int s_Level)
{ /* Call by call level 16 optimize draw line : JaeHyuk algorithm ^^ */
 float s_cx = (s_x1 + s_x2) / 2.0, s_cy = (s_y1 + s_y2) / 2.0;
 if(((int)s_x1 == (int)s_x2 && (int)s_y1 == (int)s_y2) || s_Level > 16)DrawPixel(s_Color, (int)s_cx, (int)s_cy);
 else
 {
  s_Level++;	
  __DrawLine__(s_Color, s_x1, s_y1, s_cx, s_cy, s_Level); __DrawLine__(s_Color, s_cx, s_cy, s_x2, s_y2, s_Level);
 }
}

static void DrawLine(int s_Color, int s_x1, int s_y1, int s_x2, int s_y2)
{
 __DrawLine__(s_Color, (float)s_x1, (float)s_y1, (float)s_x2, (float)s_y2, 0);
}

이것은 전통적인 원을 그리는 소스입니다.

static void DrawCircle(int s_Color, int s_x, int s_y, int s_r)
{
 double s_Pi, s_Grid = 1.0 / ((double)s_r), s_sinX, s_cosY; 
 for(s_Pi = 0.0;s_Pi < (DEF_2PI / 4.0);s_Pi += s_Grid)
 {
  s_sinX = sin(s_Pi) * (double)s_r; s_cosY = -cos(s_Pi) * (double)s_r;	 
  DrawPixel(s_Color, (int)(s_x + s_sinX), (int)(s_y + s_cosY));
  DrawPixel(s_Color, (int)(s_x - s_sinX), (int)(s_y + s_cosY));
  DrawPixel(s_Color, (int)(s_x + s_sinX), (int)(s_y - s_cosY));
  DrawPixel(s_Color, (int)(s_x - s_sinX), (int)(s_y - s_cosY));
 }
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.