[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/07/05(Thu) 20:22
投稿者名:なな
Eメール:
URL :
タイトル:
ラインを描き、重ならずに始点の横に文字を表示したい
お世話になります。

VB歴3年のPGです。
環境:VB6(SP5) WinXp

PictureBox上でラインを描き、重ならずに支点の横に数字を表示したいです。
イメージは以下を参照してください。

-イメージ(矢印をラインと考えてください)----
      B 
@→  ↑ ↓  ←C
    A
----------------------------------------------

以下のようなソースで数字を表示しています。
現在、問題となっているのは、ほとんどの場合は以下のソースでもOKですが。
ラインの角度によっては、ラインと数字が重なってしまいます。
(ラインは自由な角度で描くことが可能です。)
ラインの支点に固定で、100をプラスしているのが問題だと思いますが。
実際にセットする値をどのように導き出せば良いか分かりません。

Picture1.fontBold = False
Picture1.fontSize = 10
Picture1.fontName = "MS 明朝"
Picture1.ForeColor = vbRed
Picture1.CurrentX = x1 + 100
Picture1.CurrentY = y1 + 100
Picture1.Print "1"

※数字を表示する方法として、ラベルを表示する方法も考えられますが。
PictureBoxに直接、文字を表示する方法のみで考えています。

以上 よろしくお願いします。

投稿時間:2007/07/06(Fri) 00:24
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re: ラインを描き、重ならずに支点の横に文字を表示したい
こんにちは。こういう問題は好きですよ。
でも、完全サポートするのは手がかかりそうなのでヒントだけに留めます。

> PictureBox上でラインを描き、重ならずに支点の横に数字を表示したいです。

「始点」では?


> ラインの角度によっては、ラインと数字が重なってしまいます。

引いたラインに直行する仮想引き出し線を引けば良いんでしょ?
ただ、単純にそれだけだと数字の大きさによっては直線と重なる恐れがあるので、
数字の大きさの分だけ仮想引き出し線端点から離れたところから数字を書き初め
なけねばならないですね。

> (ラインは自由な角度で描くことが可能です。)

それがプログラミングできるのであれば、直行する線分も描ける筈。

投稿時間:2007/07/06(Fri) 10:22
投稿者名:なな
Eメール:
URL :
タイトル:
Re^2: ラインを描き、重ならずに始点の横に文字を表示したい
ダンボ様

おはようございます。
確か前回も相談にのっていただいたと思います。
いつもありがとうございます。

> こんにちは。こういう問題は好きですよ。
このように言っていただけるとうれしいです。

> でも、完全サポートするのは手がかかりそうなのでヒントだけに留めます。
ヒントだけでもありがたいです。

> > PictureBox上でラインを描き、重ならずに支点の横に数字を表示したいです。
>
> 「始点」では?
申し訳ありません。間違いです。お恥ずかしいです(^_^;)

>
> > ラインの角度によっては、ラインと数字が重なってしまいます。
>
> 引いたラインに直行する仮想引き出し線を引けば良いんでしょ?
> ただ、単純にそれだけだと数字の大きさによっては直線と重なる恐れがあるので、
> 数字の大きさの分だけ仮想引き出し線端点から離れたところから数字を書き初め
> なけねばならないですね。
>
> > (ラインは自由な角度で描くことが可能です。)
>
> それがプログラミングできるのであれば、直行する線分も描ける筈。
上記のヒントで思い通りにいけそうです。

投稿時間:2007/07/06(Fri) 10:26
投稿者名:よねKEN
Eメール:
URL :
タイトル:
Re: ラインを描き、重ならずに始点の横に文字を表示したい
私の方は手抜き案ですが、よければどうぞ。

> ラインの支点に固定で、100をプラスしているのが問題だと思いますが。
> 実際にセットする値をどのように導き出せば良いか分かりません。

始点(x1, y1)、終点(x2, y2)、数字を書く位置(Xn, Yn)としましょう。

始点(x1, y1)に単に100を足すだけだと、
例えば終点(x2, y2)が(x1+50, y1+50)だとアウトですね。

(1) Xnについて
 X1 < X2の場合
  右方向に線は伸びているので、XnはX1より左側にあればよい。
 X1 = X2の場合
  Y軸方向に伸びているので、XnはX1と同じでもよい。
 X1 > X2の場合
  左方向に伸びているので、XnはX1より右側にあればよい。

 これらをまとめるとsgn関数を使って以下のようにXnを求めれば安全。
 Xn = X1 + sgn(X1-X2) * 100
 ※ 100は数字の大きさに合わせて適当に調整

(2) Ynについて
X座標方法の場合と同じ考え方
 Yn = Y1 + sgn(Y1-Y2) * 100

といった感じです。

投稿時間:2007/07/06(Fri) 11:11
投稿者名:y4yama
Eメール:
URL :
タイトル:
Re^2: ラインを描き、重ならずに始点の横に文字を表示したい
こんちは
> 始点(x1, y1)、終点(x2, y2)、数字を書く位置(Xn, Yn)としましょう。
と同じ定義にさせていただき更に先のイメージで@というように
数字は1文字なら、数字の中心点をbx、by、直線の長さをlen1としました。
数字は直線からB(150とか)だけバックしたところに出したいと思いますので
bx=(x1-x2)*B/len1
by=(y1-y2)*B/len1
(Xn, Yn)は、文字の大きさの半分を、bx、byから引く
Xn=bx-(w/2)

先のイメージに一番近い計算かと思いま〜す
文字数が大きいなら、アウトですぅ

投稿時間:2007/07/06(Fri) 15:10
投稿者名:なな
Eメール:
URL :
タイトル:
Re^3: ラインを描き、重ならずに始点の横に文字を表示したい
よねKEN 様
y4yama 様

こんにちは。ご回答ありがとうございますm(__)m
皆様の、ヒントにより解決しました。

ラインの横に綺麗に数値が表示されるようになりましたので
ラインを引くのが楽しくなってしまいました(^^♪
(昨晩の気持ちとは、全く逆の気分です)

また、分からないことがあると思いますが
よろしくおねがいします。

投稿時間:2007/07/06(Fri) 17:55
投稿者名:よねKEN
Eメール:
URL :
タイトル:
Re^4: ラインを描き、重ならずに始点の横に文字を表示したい
> こんにちは。ご回答ありがとうございますm(__)m
> 皆様の、ヒントにより解決しました。

どの案で解決されたのでしょうか?
それともみんなの案の折衷案?

解決策のまとめをコメントいただけるとうれしいです。

投稿時間:2007/07/10(Tue) 16:08
投稿者名:なな
Eメール:
URL :
タイトル:
Re^5: ラインを描き、重ならずに始点の横に文字を表示したい
こんにちは。
返信が遅くなりました。


> どの案で解決されたのでしょうか?
> それともみんなの案の折衷案?
@みなさんの案を少しずつに参考にさせていただいた
A元々あったソース(ローカルにあるソースです)を改造
Bかなり考えていたので自己解決

の@〜Bを折衷した感じだと思います。

ローカルのソースは、「使えない」と思っていましたが。
ヒントを読ませていただき、頭の中が整理できると、「使える」と思えるようになりました。
皆様にヒントをいただいたのに解決方法が説明不足になってしまい、申し訳ないです。

以下のソースで解決しました。
----------------------------------------
     '■線本体の描画角度を求める
    Dim radian_org As Double
    Dim angle_org As Double
    'x切片とy切片から度を求める
    If x2 - x1 = 0 Then
        '直線の時の考慮
        If y2 > y1 Then
            angle_org = 90
        Else
            angle_org = 270
        End If
    Else
        'ラジアン単位で本体の直線の傾きを求める
        radian_org = Math.Atn((y2 - y1) / (x2 - x1))
        'ラジアンから角度に変換する
        angle_org = radian_org * (180 / PI)
        If x1 > x2 Then
            angle_org = angle_org + 180
        End If
    End If
    
    '■文字開始位置は線の角度は求めた角度より180度とする
    Dim angle_a1 As Double
    Dim radian_a1 As Double
    Dim x_a1 As Single
    Dim y_a1 As Single
    '角度を+180度
    angle_a1 = angle_org + 180
    
    'ラジアン単位に変換
    radian_a1 = angle_a1 / (180 / PI)
    
    '「半径(100)の円+文字のサイズ」を考えてcos,sinで座標を求める
    If x1 < x2 Then
      x_a1 = Math.Cos(radian_a1) * (100 +フォント横幅)
    Else
       x_a1 = Math.Cos(radian_a1) * (100)
    End If
    
    If y1 < y2 Then
       y_a1 = Math.Sin(radian_a1) * (100 + フォント縦幅)
    Else
       y_a1 = Math.Sin(radian_a1) * (100)
    End If
----------------------------------------
ポイントは、
・文字開始位置は、線本体の角度より180度の位置にある。
・フォント横幅・任意の距離・Cosでを「x_a1」を求める。
・フォント縦幅・任意の距離・Sinでを「y_a1」を求める。
・固定で100をプラスしていた所に、それぞれx_a1・y_a1をプラスしてあげる。
だと思います。

投稿時間:2007/07/10(Tue) 17:03
投稿者名:よねKEN
Eメール:
URL :
タイトル:
Re^6: ラインを描き、重ならずに始点の横に文字を表示したい
ななさん、まとめ投稿ありがとうございます。

> ・文字開始位置は、線本体の角度より180度の位置にある。

なるほど、正攻法を取られたのですね。
#正攻法で実現するとごちゃごちゃしたコードになるかなと思ったのですが、
#私が予想していたより、すっきりしたコードになってます(^^;