Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
PathData.FlattenToPolygon (Polygon) sorunu
#1
Merhaba.
 (Firemonkey içerir)
 Vektorel bir çizim barındıran PathData dan çizimin içeriğini Polygon olarak alıyorum. Polygonun son değeri çizimle ilgisi olmayan değerleri alıyor. Aşağıda kırmızı ile belirttiğim değer.

PathData verimiz: M5500,19850 L15500,19850 L15500,9850 L5500,9850 Z  (Kare çiziyoruz.)
Çıkan Polygon değerleri:
X: 5500  Y: 19850
X: 15500  Y: 19850
X: 15500  Y: 9850
X: 5500  Y: 9850
X: 5500  Y: 19850 (Bu satır verimizde gözükmemesine rağmen burada. Sebebi açık kalan çizimin otomatik kapatılması. Burada sorun yok.)
X: 16777215  Y: 16777215 (Bu değer hakkında tek söyleyebileceğim 2^24-1)


Kod kısaca şu şekilde:
uses FMX.Graphics, System.Math.Vectors;

procedure TForm1.Button1Click(Sender: TObject);
var pd1 : TPathData; p1 : TPolygon;
Sayac1: Integer;
begin
pd1 := TPathData.Create;
pd1.Data := 'M5500,19850 L15500,19850 L15500,9850 L5500,9850 Z';
pd1.FlattenToPolygon(p1, 10);
Memo1.Lines.Add(pd1.Data);
for Sayac1 := 0 to Length(p1)-1 do
  Memo1.Lines.Add('X: ' + p1[Sayac1].X.ToString+'  Y: ' + p1[Sayac1].Y.ToString);
end;

Konu hakkında fikri olan var mı?
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#2
Merhaba,
Yalnızca Polygon'a ait çizim koordinatlarını almak isterseniz; TPathData tipinde tanımlamış olduğunuz değişkenin Points özelliğini kullanabilirsiniz.

Örnek:

procedure TForm1.Button1Click(Sender: TObject);
var
 pd1: TPathData;
 p1: TPolygon;
 Sayac1: Integer;
begin
 pd1 := TPathData.Create;
 pd1.Data := 'M5500,19850 L15500,19850 L15500,9850 L5500,9850 Z';
 pd1.FlattenToPolygon(p1, 10);
 Memo1.Lines.Add(pd1.Data);
 for Sayac1 := 0 to pd1.Count - 1 do
   Memo1.Lines.Add('X: ' + pd1.Points[Sayac1].Point.X.ToString + ' Y: ' +
     pd1.Points[Sayac1].Point.Y.ToString);
end;


Ekran Görüntüsü

jl2zap.jpg
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#3
Evet bahsettiğiniz mevcut çizim koordinatlarını almak için başarılı yalnız şu var. FlattenToPolygon ile mecut çizimde düz çizgiler dışında çizimler (arc, ellipse vs..) varsa bunları düz çizgiye dönüştürerek polygona aktarıyor. Aşağıdaki veriyi benim ve sizin verdiğiniz örnekte işleyerek farkı açıkça görebilirsiniz.

M15500,14850 C15500,12089 13261,9850 10500,9850 C7739,9850 5500,12089 5500,14850 C5500,17611 7739,19850 10500,19850 C13261,19850 15500,17611 15500,14850 Z
(Bu verilerin neye benzediğini Path bileşeninde görebilirsiniz.)
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#4
Merhaba,
Aradaki farkı zaten siz belirtmiştiniz. FlattenToPolygon method'u içerisinde yer alan ek koordinatlar hakkındaki sorunuzu anlayamadım.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#5
Sorun son satır neden X: 16777215 Y: 16777215 değerlerini alıyor? Bu değerler "artık satır sonuna geldin arkadaş" mı oluyor?
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#6
(23-09-2016, Saat: 12:56)engerex Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlSorun son satır neden X: 16777215  Y: 16777215 değerlerini alıyor? Bu değerler "artık satır sonuna geldin arkadaş" mı oluyor?

Bu konuda bir fikrim yok. Kullandığı bir temp olabilirmi? Nesnelerdeki Tag gibi.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#7
Aynen dediğim gibi. Her Path verisi kapandığında X ve Y 16777215  değerini alıyor. Bu değerleri gördüğünüzde poligon bitmiştir. Yalnız polygonu bir canvasa yazdırmaya kalktığımızda ve bu satırdan sonra veriler devam ediyorsa sıkıntı yaşayabilirsiniz. Neden polygonum boş diyebilirsiniz. Buna dikkat.

Daha farklı bir sorun var. Arc gibi Line dışındaki vektörel şekilleri Line yapmak istiyoruz ancak bunu herhangi bir polygona değil mevcut PathData üzerinde yapmak istiyoruz. Yapmamız gereken  PathData1.Flatten(); Yalnız bir sorunumuz var.


procedure TForm1.Button1Click(Sender: TObject);
var
 PathD : TPathData;
begin
 PathData1 := TPathData.Create;
 PathData1.Data := 'M0,0 L0,100 L100,100 L100,0 L0,0 Z';
 Memo1.Lines.Add(PathData1.Data);
  PathData1.Flatten();
 Memo1.Lines.Add(PathData1.Data);
 PathD.Flatten();
 Memo1.Lines.Add(PathData1.Data);
 PathData1.Flatten();
 Memo1.Lines.Add(PathData1.Data);
end;

 Ortaya aşağıdaki gibi saçma bir sonuç çıkıyor. Her flatten işleminde fazladan M0,0 değeri oluşuyor. Her seferinde point sayısı 2 katının 1 fazlasına çıkıyor.
 İlk baştaki verilerimiz sadece düz çizgi içerdiği için düzleştirilecek şekil yok. Olsa da farketmiyor. Sonuç aynı.
M0,0 anlamı Canvastan hatırlayacağımız MoveTo(0,0) ile benzer mantık.

Alıntı:M0,0 L0,100 L100,100 L100,0 L0,0 Z 

M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 L0,100 L100,100 L100,0 L0,0 Z 

M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 L0,100 L100,100 L100,0 L0,0 Z 

M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 M0,0 L0,100 L100,100 L100,0 L0,0 Z 

 Bunun mantıklı bir açıklaması var mıdır?
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  FMX Android Push Notification Sorunu rafikhasguller 0 81 13-04-2018, Saat: 16:37
Son Yorum: rafikhasguller
  Webbrowser video fullscreen sorunu hakanharbeli 2 100 10-04-2018, Saat: 00:55
Son Yorum: hakanharbeli
  FMX.FontGlyphs.Android.pas sorunu BY-HAYALET 4 151 09-04-2018, Saat: 10:53
Son Yorum: BY-HAYALET
Question uygulama donma sorunu - webbrowser BY-HAYALET 7 269 14-03-2018, Saat: 15:26
Son Yorum: BY-HAYALET
  datasnap Mobil İnternet bağlantı sorunu hakanharbeli 9 308 19-02-2018, Saat: 08:36
Son Yorum: hakanharbeli



Konuyu Okuyanlar: 1 Ziyaretçi