「Xamarin.MacでNSPathをCGPathに変換する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
(ページの作成:「CoreGraphicsのCGPath系にはベジェ曲線を手軽に扱えるクラスがない。 一方でNSPath系にはNSBezierPathというズバリなものがある...」)
 
imported>Administrator
(Administrator がページ「Xamarin.Mac/NSPathをCGPathに変換する」を「Xamarin.MacでNSPathをCGPathに変換する」に移動しました)
 
(同じ利用者による、間の1版が非表示)
50行目: 50行目:
  
 
== 使い方 ==
 
== 使い方 ==
ベジェ曲線描いてみた。
+
線を描いてみた。
 
<source lang="csharp">
 
<source lang="csharp">
 
         public override void DrawRect(CGRect dirtyRect)
 
         public override void DrawRect(CGRect dirtyRect)

2019年5月22日 (水) 05:13時点における最新版

CoreGraphicsのCGPath系にはベジェ曲線を手軽に扱えるクラスがない。 一方でNSPath系にはNSBezierPathというズバリなものがある。 なら変換してしまえばいいんじゃね。

実装[編集 | ソースを編集]

拡張メソッド追加してみた。

using System;
using System.Collections.Generic;
using System.Linq;
using Foundation;
using AppKit;
using CoreGraphics;

    public static class NSBezierPathExtensions
    {
        public static CGPath ToCGPath(this NSBezierPath nsPath)
        {
            var cgPath = new CGPath();
            var points = null as CGPoint[];

            for (int i = 0; i < nsPath.ElementCount; i++)
            {
                var type = nsPath.ElementAt(i, out points);

                switch (type)
                {
                    case NSBezierPathElement.MoveTo:
                        cgPath.MoveToPoint(points[0]);
                        break;

                    case NSBezierPathElement.LineTo:
                        cgPath.AddLineToPoint(points[0]);
                        break;

                    case NSBezierPathElement.CurveTo:
                        cgPath.AddCurveToPoint(cp1: points[0], cp2: points[1], point: points[2]);
                        break;    

                    case NSBezierPathElement.ClosePath:
                        cgPath.CloseSubpath();
                        break;    
                }
            }

            return cgPath;
        }
    }

使い方[編集 | ソースを編集]

線を描いてみた。

        public override void DrawRect(CGRect dirtyRect)
        {
            // 準備
            var cg = NSGraphicsContext.CurrentContext.GraphicsPort;
            cg.SetFillColor(red: 1.0f, green: 0.0f, blue: 0.0f, alpha: 1.0f);
            cg.SetStrokeColor(red: 0.0f, green: 1.0f, blue: 1.0f, alpha: 1.0f);
            cg.SetLineWidth(w: 2.0f);

            // パス
            using (var path = new NSBezierPath())
            {
                // 形状の始点を設定する
                path.MoveTo(new CGPoint(100f, 0f));

                // 線を引く
                path.LineTo(new CGPoint(200f, 40f));
                path.LineTo(new CGPoint(160f, 140f));
                path.LineTo(new CGPoint(40f, 140f));
                path.LineTo(new CGPoint(0f, 40f));

                // 形状を閉じる
                path.ClosePath();

                // NSPath -> CGPath 
                // ※ToCGPathは独自の拡張メソッド
                cg.AddPath(path.ToCGPath());
            }

            // 塗りつぶす
            cg.FillPath();
        }

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]