問題タブ [cgpath]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1148 参照

iphone - 以前に準備された CGPath を描画すると、CATiledLayer がクラッシュする

UIScrollView 内に配置した UIView のバッキング レイヤーとして CATiledLayer を使用しています。ビューの init メソッドで、単純な線を描画する CGPathRef オブジェクトを作成しています。drawLayer:inContext 内でこのパスを描画しようとすると、スクロール/ズームしているときに、(まれに) EXEC_BAD_ACCESS でクラッシュすることがあります。

コードは非常に単純です。標準の CG* 関数のみを使用しています。

更新: この問題は iOS 5 にのみ存在することに気づきました。4.3 では問題なく動作します。

0 投票する
1 に答える
1219 参照

objective-c - CGPath を使用する利点は何ですか?

私はCGPathの概念に不慣れで、ベジエ曲線についてまともな考えを持っています. ビューを使用して小さなフリーハンド描画プログラムを作成しています。drawRect では、配列から記録された一連の行を描画し続けます。マウスが動いている間に、その配列に新しい行を追加し、ビューを更新します。drawrect が再度呼び出され、記録された一連の行が再度描画されます。

私は CGPath について読んでいました。一連の線とベジエ曲線を保存します。

CGPath を使用すると、パフォーマンスが向上しますか?

0 投票する
1 に答える
1548 参照

objective-c - 文字列としてのCGPath

CGPathの実際のデータを取得して、ファイルに保存して後で復元できるようにする方法はありますか?

そして、そのデータがどのように構造化されているかについてのドキュメントはありますか?

文字列(SVGパス文字列など)として、または辞書オブジェクトとPList XMLファイルを使用して何らかの方法で記述したいのですが、取得できるものを使用します。

0 投票する
3 に答える
181 参照

objective-c - 画面が更新されたときにどの行を再描画するかを決定するために、どのアルゴリズムを使用する必要がありますか?

画面上で描画および消去できるシンプルな iOS View ベースのアプリケーションを作成しました。既に描画されたパスを格納するために NSMutableArray を使用しています。コントロールをマーカーから消しゴムに、またはその逆に切り替えるたびに、現在の CGPath を配列に追加して新しいものを作成します。

drawRect のたびに、消しゴムのパスかマーカーのパスかに応じて、適切な色で配列のパスを再描画します

タッチの移動に合わせて描画されている現在のものも描画します。

これはまったく良い解決策ではなく、配列のサイズが大きくなるにつれて大量の RAM を消費することがわかりました。私の配列には、すでに同じ色で色付けされたポイントを実際に通過する冗長パスが既に含まれており、それを再度実行するためにプロセッサの時間を不必要に消費し、メモリも消費します。

リソースを節約するためのより良いアルゴリズムを参照できる人はいますか?

0 投票する
1 に答える
4346 参照

calayer - 新しく作成された CAShapeLayer の正しいフレームの設定

要するに:

  1. frameApple は、またはboundsを自動的に設定しませんCAShapeLayer(また、Apple は に相当するものを実装していません[UIView sizeThatFits]) 。
  2. パスの境界ボックスのサイズを使用してフレームを設定すると、すべてがうまくいきません。どんなに設定しようとしても、パスを台無しにします

CAShapeLayerでは、新しく追加された で新しく作成された のフレームをプログラムで設定する正しい方法は何CGPathですか? Apple のドキュメントはこの件について沈黙を守っています。

私が試したこと、うまくいかないこと:

  1. 作成するCAShapeLayer
  2. を作成CGPathし、レイヤーに追加します
  3. レイヤーを確認してくださいframe- それは{{0,0},{0,0}}
  4. 設定:layer.frame = CGPathGetBoundingBox( layer.path )
  5. フレームは正しくなりましたが、パスは DOUBLE オフセットになりました - を変更するframeと、パスが実質的に余分な(x,y)ピクセル分シフトされます

  6. 設定:layer.bounds = CGPathGetBoundingBox( layer.path )

  7. ...すべてが狂ってしまいます。もう何も意味がない
  8. 実行して修正してみてくださいlayer.position = CGPathGetBoundingBox( layer.path ).origin
  9. ...サイコロはありません。まだナッツ。

私が試したことの1つは、DIDが機能することですが、他の場所で問題を引き起こします:

編集:画面を自動回転するとすぐに壊れます。私の推測: Apple の自動回転には、「変換」プロパティの制御が必要です。

  1. 作成するCAShapeLayer
  2. を作成CGPathし、レイヤーに追加します
  3. レイヤーのフレームを確認してください - それは{{0,0},{0,0}}
  4. 設定:layer.frame = CGPathGetBoundingBox( layer.path )
  5. 設定:layer.transform = CGAffineTransformMakeTranslation( CGPathGetBoundingBox( layer.path ).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin

CALayerこれは機能しますが、多くのサードパーティ コードでは、a の初期変換が Identityであると想定されています。

こんなに難しくないはず!確かに私はここで間違っていることがありますか?

(「パスを追加するたびに、手動でカスタム関数を実行してすべてのポイントをシフトする」という提案がありました-1 * (top-left-point.x, top-left-point.y)。繰り返しますが、それは機能しますが、非常に複雑です)

0 投票する
2 に答える
159 参照

iphone - 曲線を変更/修正するためにどのアルゴリズムを使用する必要がありますか

UIBezierPathを使用して、多数の曲線を描画するアプリケーションを作成しました。今、私はそれに変更機能を実装しようとしています。特定の曲線を変更するために私ができることの1つは、すべての曲線を再度描画することです。私はまだこれを実装していません。しかし、曲線の数が増えると、このアルゴリズムはあまり効率的ではないと思います。配列内のすべてのポイントを格納する必要があり、変更するたびにforループを実行して各曲線を描画する必要があるためです。

より効率的なアルゴリズムを探しています。誰かがサンプルコードを提供できれば役に立ちます。

0 投票する
1 に答える
1634 参照

iphone - 不規則な形状の UIBezierPath の塗りつぶし

私はいくつかのカスタムコントロールを作成しています。コントロールのサブビューの 1 つは透明UIViewで、UIBezierPathパスが描画されています。写真の 1 つは境界線としましょうUIBezierPath([パス ストローク] と呼ばれます) ですが、2 番目の写真では [パス フィル] を呼び出すとどうなるかがわかります。最初の写真のような形になるようにパスを塗りつぶしたいと思います。drawRectこのトランスペアレントからのメソッドUIViewは以下のとおりです。

手伝ってくれてありがとう !

最初の画像 2 番目の画像

0 投票する
5 に答える
8311 参照

objective-c - CGPathを頻繁に描画するときのパフォーマンス

データを線グラフとして視覚化するiOSアプリに取り組んでいます。グラフはCGPathフルスクリーンカスタムで描画されUIView、最大320のデータポイントが含まれます。データは頻繁に更新されるため、それに応じてグラフを再描画する必要があります。リフレッシュレートは10/秒が適切です。

これまでのところ簡単です。ただし、私のアプローチには多くのCPU時間がかかるようです。1秒間に10回で320セグメントでグラフを更新すると、iPhone 4SでのプロセスのCPU負荷が45%になります。

たぶん私は内部のグラフィックス作業を過小評価していますが、私にはそのタスクにはCPU負荷が大きいように見えます。

以下は、drawRect()新しいデータセットの準備ができるたびに呼び出される私の関数です。Nポイントの数を保持し、描画する座標をpoints持つベクトルです。CGPoint*

ここで提案されているように、現在のレイヤーにパスを追加する前に、まずオフラインCGContextへのパスをレンダリングしようとしましたが、肯定的な結果は得られませんでした。また、CALayerに直接描画するアプローチをいじりましたが、それでも違いはありませんでした。

このタスクのパフォーマンスを改善する方法について何か提案はありますか?それとも、レンダリングは、私が認識しているCPUの作業が単純に多いのでしょうか。OpenGLは意味がありますか/違いはありますか?

ありがとう/Andi

更新:私もUIBezierPathの代わりに使用してみましCGPathた。この投稿は、なぜそれが役に立たなかったのかについての良い説明を提供します微調整CGContextSetMiterLimit等。また、大きな安堵をもたらさなかった。

アップデート#2:私は最終的にOpenGLに切り替えました。それは急でイライラする学習曲線でしたが、パフォーマンスの向上は驚くべきものです。ただし、CoreGraphicsのアンチエイリアシングアルゴリズムは、OpenGLの4xマルチサンプリングで実現できるものよりも優れた機能を果たします。

0 投票する
2 に答える
1304 参照

objective-c - CGPath をファイルに保存する方法

以下のような CALayers 内に約 20 個の単純な形状を描画しています (CAShapelayer で描画された CGPaths)。現在、この形式の 20 個の図形すべてを含む非常に長いファイルがあります。親UIViewが作成されると、前の画面で選択されたものに基づいて、これらの形状の1つが読み込まれます.これはうまく機能していますが、形状コードを維持するのは面倒です. 以下のコードのブロックを取得し、必要に応じて呼び出して実行できる個別のファイルに保存する最良の方法は何ですか?(例: star.txt、apple.txt、moon.txt、tree.txt):

0 投票する
1 に答える
589 参照

ios - カラー バーンを CGPath の内側に制限する

CGPath (実際には、CGMutablePath) として定義された閉じたパスがあります。

パスで定義された UIImage の特定の領域をカラー焼き付けしたい。私は Core Graphics をいじっていますが、現在のところ、私の唯一のオプションは、パスではなく、CGRect によって定義された長方形の領域に色を付けることです。

誰かが私を正しい方向に向けることができますか?

- アップデート

Rob の助けを借りて、カメラから取得した画像を 90 度回転させて、UIImageview に正しく表示されるようにしました。

私が残した唯一の問題は、描画する必要がある PATH がまだ 90 度であり、縮尺が合っていないことです。私が現在使用しているコードは次のとおりです。

その結果が次の画像です。赤い四角形は CGPATH を表しています。白い四角は、実際にはパス上の上記の方法の結果です。

http://i41.tinypic.com/f1zbdi.png

COS 数学を使用して CGPATH を手動で 90 度回転させる必要があると思います。