「Xamarin.Mac/NSViewの座標系を左下原点から左上原点に変更する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
(ページの作成:「NSViewでは標準で「左下が原点で右が+Xで上+Y」となっている。 いわゆる小学校の算数で習う座標系だ。 エクセルのグラフな...」)
 
 
(同じ利用者による、間の3版が非表示)
3行目: 3行目:
 
[[エクセル]]のグラフなども基本はこれである。
 
[[エクセル]]のグラフなども基本はこれである。
  
しかし[[コンピューター]]の世界ではなぜか古くから「左上が原点で下方向が+Yで右方向が+X」という座標系が一般的となっている。
+
しかし[[コンピューター]]および[[コンピューター・グラフィックス]]の世界ではなぜか古くから「左上が原点で下方向が+Yで右方向が+X」という座標系が一般的となっている。
PC-9801のGRAMもWindowsのGDIもDirectXも皆これである。
+
[[PC-9801]]の[[GRAM]]も[[Windows]]の[[GDI]]も[[DirectX]]も皆これである。
このためWindowsなどからアプリを移植する際にこの点を考慮しないでコピペすると逆さま表示になる。
+
このため[[Windows]]などから[[アプリ]]を[[移植]]する際にこの点を考慮しないで[[コピペ]]すると逆さま表示になる。
  
 
しかし根本の[[ソースコード]]が壮大すぎて手を入れるのが難しい場合もある。
 
しかし根本の[[ソースコード]]が壮大すぎて手を入れるのが難しい場合もある。
 
そういうときはNSViewのIsFlippedプロパティをオーバーライドして常に「true」を返すようにすればよい。
 
そういうときはNSViewのIsFlippedプロパティをオーバーライドして常に「true」を返すようにすればよい。
この設定は、NSGraphcis系のみならず、CoreGraphicsにも反映される。
+
この設定は、NSGraphcis系のみならず、[[CoreGraphics]]にも反映される。
  
 
<source lang="csharp">
 
<source lang="csharp">
15行目: 15行目:
 
public partial class FlippedView : AppKit.NSView
 
public partial class FlippedView : AppKit.NSView
 
{
 
{
 +
    // trueで左上原点
 +
    // falseで左下原点
 
     public override bool IsFlipped { get { return true; } }
 
     public override bool IsFlipped { get { return true; } }
 +
 +
    // 描画
 +
    public override void DrawRect(CoreGraphics.CGRect dirtyRect)
 +
    {
 +
        var cgContext = NSGraphicsContext.CurrentContext.GraphicsPort;
 +
        cgContext.MoveTo(100, 100);
 +
        cgContext.AddLineToPoint(200, 200);
 +
        cgContext.StrokePath();
 +
    }
 
}
 
}
 
</source>
 
</source>
28行目: 39行目:
 
* [[Xamarin.Mac/スクリーンキャプチャを撮る]]
 
* [[Xamarin.Mac/スクリーンキャプチャを撮る]]
 
* [[Xamarin.Mac/ディスプレイの物理サイズを取得する]]
 
* [[Xamarin.Mac/ディスプレイの物理サイズを取得する]]
 +
* [[Xamarin.Mac/NSViewControllerからNSWindowを取得する]]
  
 
== 参考文献 ==
 
== 参考文献 ==

2017年6月19日 (月) 02:12時点における最新版

NSViewでは標準で「左下が原点で右が+Xで上+Y」となっている。 いわゆる小学校の算数で習う座標系だ。 エクセルのグラフなども基本はこれである。

しかしコンピューターおよびコンピューター・グラフィックスの世界ではなぜか古くから「左上が原点で下方向が+Yで右方向が+X」という座標系が一般的となっている。 PC-9801GRAMWindowsGDIDirectXも皆これである。 このためWindowsなどからアプリ移植する際にこの点を考慮しないでコピペすると逆さま表示になる。

しかし根本のソースコードが壮大すぎて手を入れるのが難しい場合もある。 そういうときはNSViewのIsFlippedプロパティをオーバーライドして常に「true」を返すようにすればよい。 この設定は、NSGraphcis系のみならず、CoreGraphicsにも反映される。

// アンチエイリアス無効化
public partial class FlippedView : AppKit.NSView
{
    // trueで左上原点
    // falseで左下原点
    public override bool IsFlipped { get { return true; } }

    // 描画
    public override void DrawRect(CoreGraphics.CGRect dirtyRect)
    {
        var cgContext = NSGraphicsContext.CurrentContext.GraphicsPort;
        cgContext.MoveTo(100, 100);
        cgContext.AddLineToPoint(200, 200);
        cgContext.StrokePath();
    }
}

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

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