• ベストアンサー

(C言語)スキャンライン法による三角形作成

こんにちは! 先週C言語のプログラミングの課題が出て土日もずっと考えたのですが全く意味が分かりません>< どなたか教えてください泣 内容は、スキャンライン法で二次元三角形を作り(三角形の塗りつぶし)、BMPファイルへ出力せよというものです。 1. 3角形を囲む長方形・ (xmin,xmax,ymin,ymax) 2. Y座標をymax~yminまで, 1ずつ減らしながら以下を繰り返す (a)スキャンラインSL(Y=y)発生 (b)SLと3角形との交点(線形補間) (c)交点間の画素を 表示色(r,g,b)で塗る *端点や水平線に注意 よろしくお願いします><

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>スキャンラインY=yが何を意味するのか分からないし スキャンラインSLのY座標をyとする、ということです。 スキャンラインSLは、水平な直線です。 そのY座標をyとした時に、SLと三角形の辺との交点を求めます。 交点が2つ有る場合、交点の座標は(x1,y)と(x2,y)になるので 2つの交点の間を塗りつぶす(=2つの交点の間に線を引く) この処理を、Y座標をyminからymaxまで変えながら行う。

その他の回答 (2)

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.2

海苔巻きを作るときに使用する「すだれ」を竹の棒が横になるようにぶら下げて水彩絵の具ですだれに絵を描いてみてください。竹の棒の一本一本がスキャンラインです。 筆を左右上下に動かして、すだれ全体に絵を描くのではなく、竹の棒を一本一本塗る感じで絵を書く感じです。 線形補間というのは比例を使用した補間です。早い話が、すだれの左下を原点として竹の棒の向きをx軸として考えてすだれの上に三角形を書くと、三角形の各辺はy=ax+bの形に表すことができます。頂点を除いて、それぞれの竹の棒は三角形の2つの辺と交差すると思いますから、2つの辺の交点を求めて、竹の棒のその間を塗っていけばいいでしょう?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

わからない箇所はどこでしょう? 方眼紙を用意してください。 そこに三角形を書いてください。 その三角形が収まるマスが「1」 ある横方向に並んだマス目に注目して、三角形の辺があるマスに色を塗るのが 「2」 二つの頂点を通る直線と、Y=yの交点を求めるのは、算数か数学でやったはず。 むずかしいのはBMPファイルの出力で、C言語の標準では、そのものずばりのものはありません。

noname#152791
質問者

補足

見ていただいてありがとうございます! 最初に以下のソースファイルとヘッダファイル1つとwriteBmp.cというファイルが渡されたのでBMPファイルが出力できるのだと思います。 課題はこのソースファイルに付け足すというものです! スキャンラインY=yが何を意味するのか分からないし、線形補間が何かを調べたんですが理解ができなくて困っています>< /* 24ビットBMPファイルの書き込み */ #include "cg.h" #include "writeBmp.c" /* ビットマップデータの生成 */ void mbitmap(int width, int height) { int i, j; for (i=0; i<height; i++) for (j=0; j<width; j++) { Pixel[i][j][0] = (unsigned char)255; Pixel[i][j][1] = (unsigned char)255; Pixel[i][j][2] = (unsigned char)0; } } void main(void) { int width = 640, height = 480; /* ビットマップデータの生成 */ mbitmap(width, height); /* 24ビット-ビットマップファイルへの書き込み */ bmpout("sample.bmp", width, height); }

関連するQ&A