3

System.Windows.Forms.FormF# でカスタマイズされていない (つまり、作成できる派生クラスのインスタンスではなく、既定のフォーム クラスのインスタンスを作成するだけです) を描画しようとしています。

カスタムフォームを作成しましたが、そのような新しい複雑な構造は必要ありませんでした。そのため、それを削除してコードを大幅に簡素化しました。あまりにも多く、画像を表示するのをやめました。

問題は、別の F# プロジェクトにある描画用に作成した関数にあるはずです。提供された順序でconectポイントを接続するために(関数)作成しましたが、 とは異なり、まだ気づいていない他の順序でポイント間に線を引きます(ポイントが右から左、上から下など)表されます)。System.Drawing.Graphics.DrawLines

Programa.fs 関連のコード スニペット:

let pen = new Pen(brush = Brushes.Black, width = 1.0f)
let original =            
    ([|new PointF(50.0f, 50.0f); new PointF(100.0f, 50.0f)|])

use form1 = new Form(Width = 400, Height = 400, Text = "Fractais (Teste - Windows Forms)")

form1.Paint.Add(
    fun e -> // (1)
        original
        |> List.ofArray        
        |> Base.applyFractal 1uy Base.fractalFunc1
        |> Base.conect e.Graphics pen)

書かれている代わりにラムダ式に があった場合e.Graphics.DrawLines(pen, original)、リスト内のポイント間に単純な線が引かれます。

これは、ソリューション全体の Base.fs のトラブルメーカー メソッドです。

let conect (gr:Graphics) (pen:Pen) (points:PointF list) =
    let rec usefulFunc (gr:Graphics) (pen:Pen) (points:PointF list) prevPoint =
        match points with
        | [] -> ()
        | point :: remainings ->                
            gr.DrawLine (pen, prevPoint, point)
            usefulFunc gr caneta remainings.Tail remainings.Head
    usefulFunc gr pen points.Tail points.Head

そして、Base.fsi 内の (フォーム初期化スニペットから) 呼び出されたメソッドと関連するメソッドのシグネチャ (すべての完全なメソッドの実装を提供できますが、多くのスペースが必要です。読むには長い質問です):

val fractalFunc1 : points:PointF list -> PointF list
val applyFractal : stepNumber:byte -> fractalFunc:(PointF list -> PointF list) -> points:PointF list -> PointF list
val conect : gr:Graphics -> pen:Pen -> points:PointF list -> unit

この特定の問題について、私の検索結果はありませんでした。関数を機能させる方法を知りたいconectです。

前もって感謝します。

4

1 に答える 1

5

コネクタに 1 つのエラーがあります。

fUtil gr caneta resto.Tail resto.Head

する必要があります

fUtil gr caneta resto ponto

match ステートメント内ですでに head と tail を一致させています。

次のコードは、私のために線を引きます。あまり改造する必要はありませんでした。

open System.Drawing
open System.Windows.Forms

let caneta = new Pen(brush = Brushes.Black, width = 1.0f)
let original =            
    ([|new PointF(50.0f, 50.0f); new PointF(100.0f, 50.0f)|])

let form1 = new Form(Width = 400, Height = 400, Text = "Fractais (Teste - Windows Forms)")

let conectar (gr:Graphics) (caneta:Pen) (pontos:PointF list) =
    let rec fUtil (gr:Graphics) (caneta:Pen) (pontos:PointF list) pontoAnt =
        match pontos with
        | [] -> ()
        | ponto :: resto ->                
            gr.DrawLine (caneta, pontoAnt, ponto)
            fUtil gr caneta resto ponto
    fUtil gr caneta pontos.Tail pontos.Head

form1.Paint.Add(
    fun e -> // (1)
        original
        |> List.ofArray        
        //|> aplicFractal 1uy Base.funcFractal1
        |> conectar e.Graphics caneta)

form1.Show()

Application.Run(form1)
于 2013-03-06T18:34:19.770 に答える