質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Q&A

解決済

1回答

1515閲覧

複数の線描画を用いて太い線を描画したいが回転すると隙間ができてしまう。解決法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

0グッド

0クリップ

投稿2021/06/27 09:15

提示コードですが線の太さが7以上になったら頂点を複数用意して太い線を描画しているのですが回転させると線に隙間出てきてしまいます。
原因は頂点の位置を線分ずらしていることが原因なのですがこの場合どうやって修正すればいいのでしょうか?修正方法が思いつきません。

イメージ説明

cpp

1 2 // ##################################### 線 描画 ##################################### 3 void DrawLine(glm::vec2 start,glm::vec2 end, GLfloat width,GLdouble r, glm::vec4 color) 4 { 5 glColor4f(color.x * RGBA_COLOR, color.y * RGBA_COLOR, color.z * RGBA_COLOR, color.w * RGBA_COLOR); 6 start = getWindowPosition(start); 7 end = getWindowPosition(end); 8 glm::vec2 size = glm::abs(end - start) / 2.0f; 9 10 //width の最大値と最小値を得る 11 GLfloat lineWidthRange[2] = { 0.0f, 0.0f }; 12 glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, lineWidthRange); 13 14// std::cout << lineWidthRange[0] << std::endl; 15// std::cout << lineWidthRange[1] << std::endl; 16 17 float dx = 1.0f / (FrameWork::getWindowContext()->getSize().x / 2); 18 float dy = 1.0f / (FrameWork::getWindowContext()->getSize().y / 2); 19 20 glPushMatrix(); 21 { 22 glMatrixMode(GL_MODELVIEW); 23 glTranslated(start.x + (size.x), start.y - size.y, 0); 24 glRotated(FrameWork::GetAngle(r), 0, 0, 1); 25 glLineWidth(width); //太さ 26 glBegin(GL_LINES); 27 28 if (width > 7) 29 { 30 glm::vec2 s = getWindowPosition(glm::vec2(1,1)); 31 s = s * 7.0f; 32 int n = (width / 7); 33 int nn = ((int)width % 7); 34 35 int i = 0; 36 for (; i < n; i++) 37 { 38 glVertex2f(-size.x, size.y + (7 * dy * i)); 39 glVertex2f(size.x, -size.y + (7 * dy * i)); 40 } 41 i--; 42 if (nn != 0) 43 { 44 std::cout << nn << std::endl; 45 int t = 0; 46 if (nn % 2 == 0) 47 { 48 t = nn / 2; 49 if (t == 0) 50 { 51 t = n -1; 52 53 } 54 } 55 else 56 { 57 t = nn / 2; 58 t += 1; 59 } 60 61 glVertex2f(-size.x, size.y + (t * dy) + (7 * dy * i)); 62 glVertex2f(size.x, -size.y + (t * dy) + (7 * dy * i)); 63 } 64 65 } 66 else 67 { 68 glVertex2f(-size.x, size.y); 69 glVertex2f(size.x, -size.y); 70 } 71 72 glEnd(); 73 glFinish(); 74 } 75 glPopMatrix(); 76 77 78 79 } 80

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

線を複数並べたら間が空いてしまう,と.

思いつく対処方法は

  • 隙間が見えないくらいに線をもっと高密度で並べる
  • 線の集合ではなく面とか筒として描画する

くらいでしょうか.

しかしいずれにせよ,所望の太さの単位を[pixel]で考えるとしたら,かなり面倒な話になりそう.

投稿2021/06/28 01:02

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問