HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1218
GENKIalDrawArc命令で線の端部が斜めになってしまう3解決


GENKI

リンク

2013/12/18(Wed) 00:29:15|NO.58793

Artlet2DのalDrawArc命令で円弧を太線で描画すると線の端部の角度がわずかに斜めになってしまいます。
私の環境ではどうやら1.5度ずつずれているようです。
かと言って1.5度ずつ延長するとその分余計な部分が出てしまって都合がよくありません。
例えば、半透明の描画で円弧に続けて線をつなげて描いた場合、繋ぎ目だけ不透明が強くなってしまいます。要するに繋ぎ目が目立ってしまうわけです。
また、1.5度かと思い調整し、描画半径を小さくしてみると微妙にずれます…。orz

うまい回避方法か根本的な解決方法などご存知の方おられましたらご教授ください。
それとも私は何かを勘違いしてしまっているんでしょうか…。


確認用ソース

#include "a2d.hsp" ; 仮想イメージ 0 を作成 alCreateImage 0, 640, 480 if stat = -1 : dialog "GDI+ を初期化できませんでした。" : end d = 600.0 // 半径 // s0=1.5にしても、200以下ぐらいにするとズレる f = d*0.9 // 太さ px = -d/2 + 20 py = -d/2 + 20 r0 = 0.0 // 開始角度 r1 = 90.0 // 終了角度 この条件なので端部は水平垂直になるはず! s0 = 0.0 // 描画角度を延長 // s0 = 1.5 度にすると綺麗に水平垂直になる r0 -= s0 r1 += s0*2 // 目安線 alColor 0, 0,0, 255 alPenWidth 1 alDrawLine px+d/2,py+d/2, px+d*2,py+d/2 alDrawLine px+d/2,py+d/2, px+d/2,py+d*2 // 円弧 alColor 255, 0,0, 127 alPenWidth f alDrawArc px,py, d,d, r0,r1 alCopyImageToScreen 0, 0 redraw
実行結果はこんな感じです。
https://twitter.com/genki_hsp/status/412959060397260800



この記事に返信する


ぐぅ

リンク

2013/12/18(Wed) 18:22:59|NO.58795

Artlet2DはGDI+の命令を呼び出してるだけなので、たぶんGDI+の仕様じゃないですか。
対処法はalFillPieを2回使って書いた円弧を透明色付きコピーするとか。



A.C

リンク

2013/12/19(Thu) 01:30:16|NO.58803

こんにちは、A.Cです。
グラフィックスパス機能を使って
二つの円弧とそれをつなぐ直線で無理やりやってみましたけどどうでしょうか。


#include "a2d.hsp" #module #func GdipCreatePath "GdipCreatePath" int,int #func GdipDeletePath "GdipDeletePath" int #func GdipClosePathFigures "GdipClosePathFigures" int #func GdipSetPathFillMode "GdipSetPathFillMode" int,int #func GdipFillPath "GdipFillPath" int,int,int #func GdipAddPathLine "GdipAddPathLine" int,float,float,float,float #func GdipAddPathArc "GdipAddPathArc" int,float,float,float,float,float,float #func GdipGetPenWidth "GdipGetPenWidth" int,int #deffunc alDrawArc2 int p1, int p2, int p3, int p4, double p5, double p6 if imgValid@a2d{ ;線の太さを取得 GdipGetPenWidth imgPen@a2d,varptr(ff) f=todouble(ff) ;点の位置取得用変数 rw1=0.5*(p3+f) rh1=0.5*(p4+f) rw2=0.5*(p3-f) rh2=0.5*(p4-f) ;パス作成 GdipCreatePath 0,varptr(path) ;円弧2つと、それをつなぐ直線のパス GdipAddPathLine path,rw1*cos(m_pi*p5/180)+p1+p3/2,rh1*sin(m_pi*p5/180)+p2+p4/2,rw2*cos(m_pi*p5/180)+p1+p3/2,rh2*sin(m_pi*p5/180)+p2+p4/2 GdipAddPathArc path,1.0*p1+0.5*f,1.0*p2+0.5*f,1.0*p3-f,1.0*p4-f,p5,p6 GdipAddPathArc path,1.0*p1-0.5*f,1.0*p2-0.5*f,1.0*p3+f,1.0*p4+f,p5,p6 GdipAddPathLine path,rw1*cos(m_pi*(p5+p6)/180)+p1+p3/2,rh1*sin(m_pi*(p5+p6)/180)+p2+p4/2,rw2*cos(m_pi*(p5+p6)/180)+p1+p3/2,rh2*sin(m_pi*(p5+p6)/180)+p2+p4/2 ;完成 GdipClosePathFigures path ;塗りつぶし GdipFillPath imgGraphics@a2d, imgBrush@a2d, path GdipDeletePath path return 0 } return -1 #defcfunc todouble int p1 temp = 0.0 lpoke temp, 4, (p1 & 0x80000000) | (((p1 & 0x7fffffff) >> 3) + ((p1 & 0x7fffffff) ! 0) * 0x38000000) lpoke temp, 0, p1 << 29 return temp #global ; 仮想イメージ 0 を作成 alCreateImage 0, 640, 480 if stat = -1 : dialog "GDI+ を初期化できませんでした。" : end d = 600.0 // 半径 // s0=1.5にしても、200以下ぐらいにするとズレる f = d*0.9 // 太さ px = -d/2 + 20 py = -d/2 + 20 r0 = 0.0 // 開始角度 r1 = 90.0 // 終了角度 この条件なので端部は水平垂直になるはず! s0 = 0.0 // 描画角度を延長 // s0 = 1.5 度にすると綺麗に水平垂直になる r0 -= s0 r1 += s0*2 // 目安線 alColor 0, 0,0, 255 alPenWidth 1 alDrawLine px+d/2,py+d/2, px+d*2,py+d/2 alDrawLine px+d/2,py+d/2, px+d/2,py+d*2 // 円弧 alColor 255, 0,0, 127 alPenWidth f alDrawArc2 px,py, d,d, r0,r1 alCopyImageToScreen 0, 0 redraw

円弧をつなぐ直線の座標計算はもう少しスマートな式にできそうですけど
頭がこんがらがってきたのでギブです(笑



GENKI

リンク

2013/12/22(Sun) 23:51:35|NO.58846

お二方とも回答有難うございます。
こちらでも色々と調べてみてGdipSetPenEndCapとか使ってみたりしたのですがどうも根本原因とは違うようで…。

しかたないので代替案。
おっしゃられるとおり、alFillPieを駆使するか扇型の閉空間作って塗りつぶすかしかないようなのでその方向で検討してみることにします。
ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.