先日、この場で多角形の描き方について教えて頂きました。
それを下記のように整理しました。
例えば点1(p(1),q(1)),点2(p(2),q(2)),点3(p(3),q(3))の三角形を描くために
Public Function MakePoints3(ByVal x1 As Double, ByVal y1 As Double, ByVal x2 As Double, ByVal y2 As Double, ByVal x3 As Double, ByVal y3 As Double) As Point()
Dim p1 As New Point(x1, y1)
Dim p2 As New Point(x2, y2)
Dim p3 As New Point(x3, y3)
Dim PN As Point() = {p1, p2, p3}
Return PN
End Function
というFunctionを作っておいて
PN = MakePoints3((p(1),q(1)),(p(2),q(2)),(p(3),q(3)))
pg.FillPolygon(MyBrush, PN)
と命令すれば、三角形は描けます。
但し、pg,MyBrush, PNは該当プロシジャーの中でそれぞれ必要な型に宣言しておきます。
質問は、
このやり方ですと一般的にN角形を描こうとすると、N角形毎にFunctionを作っておかなければならないので、
頂点の数が数百になった時大変なので、何かうまい方法がないかということです。
よろしくお願いします。
>先日、この場で多角形の描き方について教えて頂きました。
そのような場合はリンクを貼って頂ければ後から検索する人が
楽になります。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200501/05010095.txt
>このやり方ですと一般的にN角形を描こうとすると、N角形毎にFunctionを作っておかなければならないので、
>頂点の数が数百になった時大変なので、何かうまい方法がないかということです。
そのような要求が出てくる事を見越して上記リンクでヒントも書いたはずですが?
任意の数の座標を入力できるような手段(リストビューに点の座標を登録するなど)を考えて↓のサンプルでの関数 MakePoints の中で Point() の配列を作るような形に改造すれば汎用性が増しますね。
というところがヒントだったのですね。
ヒントであった事がいま分かりましたが、残念ながらこれだけでは理解できません。
実はこれを質問する前にアイデアとして似たようなことをいろいろ思考錯誤してみたのですがうまくいきませんでしたのでお尋ねしたわけで、すみませんが具体的方法をご教授願えませんか?
何が分からないのかを具体的に聞いたほうが回答もしやすいですね。
Point() の配列を作ることはできますか?
配列ってわかりますよね?
基本的に知りたい事は頂点の数が非常に大きな多角形を描画したいということです。
それをせんじ詰めるとPoin()の配列を作る事だというところまでは分かってきましたが、頂点の数が少ないときは教えて頂いたように
Dim PN As Point() = {p1, p2, p3}
とすればよいのでしょうが、頂点の数が不特定で非常に大きい場合はどうすればよいか分からないのです。
配列の意味は分かりますが、Point() の配列の作り方がわかりません。
質問の意味はお分かりになっていただけたでしょうか。
Dim PN As Point() = {p1, p2, p3}
というのは他の書き方もできます。
配列の宣言の仕方を一度でもヘルプで調べましたか?
宣言方法を知らなければいくら考えても分からないでしょう。
とりあえず調べてみてください。
ヘルプというメニューが一番右にあるでしょう。
そこで「検索」を選びます。
キーワードに「配列」と入力して下さい。
あなたの知りたいことがその中にあるはずです。
がんばってください。
> Point() の配列の作り方がわかりません。
ヘルプで、“ReDimステートメント”について調べてみてください。
これを使うと、配列のサイズを任意に指定できますよ。
たとえば、
ReDim Preserve PN(5)
と書くと、PN(0)〜PN(2)だった配列が、PN(5)までに拡張されます。
拡張した直後は、追加された要素が空のままなので、
PN(3) = New Point(x, y)
などとして、拡張された点の座標を追加で指定してください。
逆に、サイズを縮小した時は、最後の項目から除去されます。
ただし配列だと、最後の要素を拡張/縮小することしかできないので、
途中の要素を削除するのは面倒かと思います。
その場合(途中の項目を取り除きたい場合)には、
配列のかわりに、コレクションを使うと便利です。
コレクションは、System.Collections 名前空間に集められいます。
ヘルプで、System.Collections について調べてみてください。
たとえば、System.Collections.ArrayList クラス を使って、
Private PointList As New ArrayList()
としておいた場合、新たな座標を追加するのにも、
PointList.Add(New Point(100, 200))
PointList.Add(New Point(200, 300))
PointList.Add(New Point(300, 400))
PointList.Add(New Point(400, 500))
のように指示できます。また、途中の座標を削除するのも、
PointList.RemoveAt(2)
などと書けます。
ArrayListクラスを使った場合、FillPolygonメソッドに渡す前には、
ArrayList型からPoint()型に変換する必要がありますが、それも、
PN = PointList.ToArray(GetType(Point))
のように書くだけで、簡単に Point配列に変換できます。
System.Collections には、ArrayList 以外のコレクションクラスも
用意されていますので、余力があれば、あわせて調べてみてください。
魔界の仮面弁士様,
丁寧なご回答ありがとうございました。
解決しましたと書きたいところですが、
これを理解するには私には相当時間がかかりそうなので、
とりあえずお礼のメールを書かせて頂きました。
解決しましたらご報告いたします。
おう。もうコレクションまで話がいってる…ってゆーかほぼ答え書いてくれてるね。
ボクには実に具体的に見えますが…難しいのかぁw…まぁ、コレクションは少し…。
>実はこれを質問する前にアイデアとして似たようなことをいろいろ思考錯誤してみたのですが
そこんとこが大事なんだけどね(^^;)。プログラムは学校の計算問題みたいな
答えは無くって答えは無数にあるのね。で、選ぶのに困るわけですよ。質問者の
要求に即した回答を付けたいのに『うまくいきません』とかしか言わないから…。
自分のアイデアを改良したほうが理解も早いし、実力も付くんですが…。
配列の方で少し回答を考えてたので参考にして頂ければ…
>頂点の数が少ないときは教えて頂いたように
>Dim PN As Point() = {p1, p2, p3}
>とすればよいのでしょうが
いや、それ教えてないから(汗)最初から hiroshi さんが書いてきたコード
だから。
>Dim PN As Point() = {p1, p2, p3}
を書く時点で .net初心者 さんの書き込み
>Dim PN As Point() = {p1, p2, p3}
>というのは他の書き方もできます。
>配列の宣言の仕方を一度でもヘルプで調べましたか?
>宣言方法を知らなければいくら考えても分からないでしょう。
>とりあえず調べてみてください。
は知ってると解釈するぞ、ボクは。ってゆーか知らないと話になりません。
…万が一、知らないならホント調べておいて下さい。
配列という時点で同じ操作だからね?数値型の配列分かるよね?
Dim xData As Double()
魔界の仮面弁士さんの書き込み
>ヘルプで、“ReDimステートメント”について調べてみてください。
…分かるよね?。Point の配列、
Dim PN As Point()
同じだよね?説明するのが難しいほど簡単な事だからね?。
解決しました。
皆様ありがとうございました。示唆されたことを理解するのにもう少し時間がかかるかと思いましたが、
多角形を描くという目的に関しては解決しました。
Dim PN(1000) As Point で宣言しておき
頂点の座標(X,Y)が決まった時点で
PN(N) = New Point(X, Y)
と値を代入し、Nmax個の頂点全部の座標が定まったら
ReDim Preserve PN(Nmax)
pg.FillPolygon(MyBrush, PN)
という事でした。分かってしまうとなんだという気ですが、この周辺を何日もうろうろしていて、
振り返ると直ぐ近くまで来ていたのにという思いです。
今後ともよろしくお願いします。
ツイート | ![]() |