PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?

Başlatan z, 04 Nisan 2012, 13:20:25

z

PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?

Muhtemelen, çizim aşamasında her bir doğru parçasının başlangıç ve bitiş koordinatları saklanıyor. Daha sonra herhangi bir doğrunun herhangi bir noktası tıklandığında bunun hangi doğru parçası olduğunun programca bilinmesi (yada hesaplanması) gerekiyor.

Ekrana binlerce çizgi çizildiğini varsayarsak PCB programında tıklanan doğru parçası nerede ise anında bulunuyor. Burada uygulanan tekniği merak ediyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Kabil ATICI

Bizim çizgi olarak algıladığımın nesne bilgisayar açısından yüzeydir. Bu işlemi bütün vektörel çizim programları yapar. Hatta graplanmış nesneklere bile.
İşlem açısından düşünürsek bir veri tabanından girilen ismin bulunmasıdan bir farkı yok. İş sadece nesne tabanlı.
ambar7

z

Biraz daha açıklarmısın. Mesela   başlangıç noktası 0,0 bitiş noktası 100,100 olan kalınlıgı 20 pixel olan doğruyu çizip ardından 10,50 noktasını  tıklayalım.

Bilgisayar database'e bakıp tıklanan noktanın altında doğru varmı yokmu nasıl karar verecek? Tıklanan noktanın altında diyelimki doğru parçası var bunun başlangıç koordinatını nasıl söyleyecek.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

iyildirim

Çizim programları nasıl çalışıyor diye araştırdığımdan değil..

Büyük olasılıkla sağlam poligon kütüphaneleri kullanılıyor. 
Bir doğrunun başlangıç ve bitiş koordinatlarının yanısıra kalınlığı gibi bilgileri de var. Bununla bir poligon oluşturulur.  Net'e ait doğru parçaları için tek tek oluşturulan poligonlar toplanıp Net'in Outline veya contour denebilecek poligonu hesaplanır veya net'e ait outline poligon hazır olarak hafızada tutulur.  Sonrasında ise nokta poligon içerisinde mi kontrolu yapılır..

Aslında yapılan hesap oldukça fazla ama kullandığımız bilgisayarlar da çok hızlı.
PCB kazıma için kendi cam programımı yazarken bende poligonları dışa genişletmek, içe doğru ufaltmak veya bir poligon başka bir poligonla kesişiyormu gibi hesaplar yapmıştım. Poligon hesapları da VB6 ile yazıldığı halde saniyede birkaç bin poligon karşılaştırması yapılabiliyor. Tabii gerberden gelen poligonlar nispeten basit.
Basit poligonlar için nokta poligonun içersindemi hesabı ise optimize edilmemiş kodla bile orta seviye bir bilgisayarda rahatça saniyede birkaç bin yapılabilir. Poligon bulunduktan sonra geri kalan poligonun ait olduğu net'i bulmak ve farklı bir renkle çizmek.


z

Yalnız PC XT 8Mhz bilgisayarlarda bile bu işler çok hızlı yürüyordu. MS DOS üzerinde çalışan bu makinalarda PCB çizimlerini son derece hızlı yapabiliyorduk.

Şimdiki makinalarda Delphi ile program yazsam bahsettiğim hızlardaki MSDOS zamanının programlarının performansında olurmu tereddütüm var.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

iyildirim

Bende 4.77 XT'kullanmıştım.  :)
Kod yazarken tuşa basma ile ekran da karakterin görünmesi arasındaki gecikmeyi hissetmemek mümkün değildi.

Güncel bir makina kullanırsanız hız sorunu yaşayacağınızı düşünüyorum. 

Örnek kod nokta poligonun içersinde mi karşılaştırması yapan netten bulduğum bir kod. VB veya C kodundan Delphi'ye çevrilebilir. Sanırım Delphi de VB6 dan hızlı çalışacaktır.
Poligon koordinatları polyX() polyY() dizisine girilecek. Poligonun kapalı olması gerekli, şekli ve boyu istediğiniz gibi olabilir. 

Private Function point_In_Polygon(polySides As Long, polyX() As Long, polyY() As Long, pX As Long, pY As Long) As Boolean
 
 
 '//  Globals which should be set before calling this function:
 '//
 '//  int    polySides  =  how many corners the polygon has
 '//  float  polyX[]    =  horizontal coordinates of corners
 '//  float  polyY[]    =  vertical coordinates of corners
 '//  float  x, y       =  point to be tested
 '//
 '//  (Globals are used in this example for purposes of speed.  Change as
 '//  desired.)
 '//
 '//  The function will return YES if the point x,y is inside the polygon, or
 '//  NO if it is not.  If the point is exactly on the edge of the polygon,
 '//  then the function may return YES or NO.
 '//
 '//  Note that division by zero is avoided because the division is protected
 '//  by the "if" clause which surrounds it.
 '
 'bool pointInPolygon() {
 '
 '  int      i, j=polySides-1 ;
 '  boolean  oddNodes=NO      ;
 '
 '  for (i=0; i<polySides; i++) {
 '    if ((polyY[i]< y && polyY[j]>=y
 '    ||   polyY[j]< y && polyY[i]>=y)
 '    &&  (polyX[i]<=x || polyX[j]<=x)) {
 '      oddNodes^=(polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x); }
 '    j=i; }
 '
 '  return oddNodes; }
 '
 
 
 Dim i          As Long
 Dim j          As Long
 Dim oddNodes   As Boolean
 
 j = polySides - 1
 
 oddNodes = False
 
 For i = 0 To polySides - 1 
    If ((polyY(i) < pY And polyY(j) >= pY Or polyY(j) < pY And polyY(i) >= pY) And (polyX(i) <= pX Or polyX(j) <= pX)) Then
       oddNodes = oddNodes Xor (polyX(i) + (pY - polyY(i)) / (polyY(j) - polyY(i)) * (polyX(j) - polyX(i)) < pX)
    End If
    j = i
 Next
 point_In_Polygon = oddNodes
 End Function


elektronikhobi

Alıntı yapılan: z - 04 Nisan 2012, 14:21:49
Mesela   başlangıç noktası 0,0 bitiş noktası 100,100 olan kalınlıgı 20 pixel olan doğruyu çizip ardından 10,50 noktasını  tıklayalım.

Bilgisayar database'e bakıp tıklanan noktanın altında doğru varmı yokmu nasıl karar verecek? Tıklanan noktanın altında diyelimki doğru parçası var bunun başlangıç koordinatını nasıl söyleyecek.

Aslında farenin koordinatları bir nokta belirtiyor. O yüzden o noktanın bir dikdörtgenin içinde olup olmadığını hesaplamak çok kolay. Bunu modellerken çizgi şeklinde bir nesnemiz olabilir.

Grafik kütüphanesi farenin koordinatlarını verir. Yazılımcıya kalan da çarpışma algoritmasını yazmak. Aslında direnç gibi pek de doğrusal görünmeyen cisimler için dörtgen şeklinde çarpışma alanları kullanılıyor olabilir. Ama örneğin oyunlardaki gibi daha karışık oyun nesneleri için piksel bazında çarpışma algoritması da kullanılabilir.

Tabi oyunlardaki çarpışma algoritmaları daha karışık  ;)

http://www.metanetsoftware.com/technique/tutorialA.html

muhittin_kaplan

Bir zamanlar yazdığım bir programda (.net tabanlı) bir yüzey e mouse ile belirttiğim başlangıç bitiş noktasını (ilk tık başlangıç, ikincisi bitiş ve PopUp menu ile çizgi özelliği seçimi) sql server a kayıt etmiştim. Çizgi özelliklerini kayıt ettiğim tabloda 6-7 alan vardı diye hatırlıyorum. başlangıç, bitiş, renk, kalınlık, çizgi şekli, Oluşturma Zamanı,Açıklama gibi.
Kullanıcılar sorgularla kendi yüzeylerinde aynı çizgilerin oluşturulmasını  sağlayabiliyorlardı.
Konuyla Alakalı olmayabilir ama yakın bir sistem kullanıyor gibi geliyor.

malpaslan1979

Sadece şunu merak ediyorum tersine mühendislik mantığı içerisinde çok karmaşık olmayan bir program alınsa incelense olabilir mi? Örnek vermek gerekirse Layo1 diye bir program vardı. Kurulmuş hali bile 4.5 megabyte. Bu program bir başka program ile açılsa incelenemez mi acaba? Aşağıdaki linkte ilaçlı kürekli versiyonu var.

http://www.sonsivri.to/forum/index.php?topic=12027.0

mufitsozen

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

elektronikhobi

Bana asıl ilginç olan baskı devre çizen programları değil de devre analizi yapan programlar..

MIT'nin 6.002x için kullandığı program geçici hal analizi ("transient analysis") yapabiliyor.

Yani örneğin lede benzer bir devre elemanı ve ışık demetleri kullanarak sesi aktarmak için bir devrem olsun. Daha sonra sesin bozulmasını engellemek için bir tane büyük doğru akım (DC) veren gerilim kaynağı ve dalgalı akım (AC) veren küçük bir dalgalı akım gerilim kaynağı kullaniyorum diyelim. Sonra bunu yaptığım zaman hem sesin bozulması engelleniyor, hem de ilginç efektler ortaya çıkıyor. Merak edenler için ayrıntıları burada. (Bu arada hocanın kullandığı alet 9000-10.000 dolar civarındaymış. Ama ne özelliği var da bu kadar pahalı bilmiyorum)

6002-L7-oei12-5_100

Her neyse işte bu program örneğin böyle bir devrenin ilk 4 mikro saniye için geçici hal analizini yapıp, grafiğini çizebiliyor.

Bu tür devre analizi yapan programlar için de çizit ("graph") denilen veri yapısının kullanıldığını tahmin ediyorum. Aslında Facebook da dahil bir çok yerde kullanılıyor.. Bu arada çizit kuramının ve grafik programlamanın elektroniğe göre daha zor ama zevkli olduğunu söyleyebilirim. Hatta kitaplardan bir tanesine bu bölümü okurken yürürken elektrik direklerine ya da duran cisimlere çarpmamaya dikkat edin yazmışlardı  ;)

klax

benim cozemedigim bır konuda zoom olayını ve cızım alanı nasıl yapıyorlar
opengl ile arastırdım bulamadım
TB2EOS

z

@iyıldırım

verdiğin program örneğine bugün bakabildim. Fakat mantığı anlamadım. Örneğin poligonumuz bir üçgen ise, üçgenin köşe koordinatları belli ise, üçgenin dışındaki bir noktanın bu program örneği ile içeride mi dışarıda mı olduğunu nasıl belirliyor ben anlamadım.
(Bu algoritmadaki matematiği anlamadım.)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

iyildirim

Bülent hocam, örnek kodu kendi kodumdan kesip vermiştim. Poligonlarla ilgili çok fazla sayfa var, o an hatırlayamadım.
Sanırım kodu http://alienryderflex.com/polygon/ buradan almışım..  Aynı kod yada algoritma farklı sitelerde de karşıma çıktı..

Örnektekinin dışında da farklı algoritmalar da vardı point in poligon için.. Ama kriritk noktalarda, kenarlarda yada poligonun konveks veya konkav oluşuna göre çoğu hata yapıyordu. Örnekteki kod en azından şimdiye kadar sağlam çalıştı.

Genel olarak point in polygon için  önce nokta koordinatı tek tek poligonu oluşturan her bir doğrunun başlangıç ve bitiş koordinatları aralığındamı diye bakılıyor.
Nokta koordinatı bu aralıkta ise poligonun CW veya CCW oluşuna göre noktanın poligonu oluşturan doğruların sağında veya solunda kaldığına bakılarak karar veriliyor
 
Burada sağ sol kararını tam olarak bende anlamadım..  doğrunun birinci noktası referans alınıp nokta ve doğrunun diğer ucundaki y koordinatları oranlanıp doğrunun x eksenindeki  uzunluğu ile çarpılıp sonucun noktanın x eksenindeki uzunluğundan küçük olması na bakılıp sonuç toplanıyor..  ???
Anlayabildiğim direkt olarak koordinat farkları alındığı için sonuçlar negatif de çıkabiliyor ve poligonun yön sorun olmuyor..

Can alıcı nokta
oddNodes^=(polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x);

kısmı.. Burada bilmediğim bir geometrik bağıntı var. 

z

@iyıldırım

Verdiğin algaritma ufkumu genişletti. Daha önceleri olaya çok farklı bakarken şimdi bu tip bir problemlere nasıl matematiksel yaklaşılacağının farkına vardım.

Verdiğin algoritma da şimdi anlatacağım yönteme benziyor belki de aynısı.

Bir poligonun olsun. Verilen bir noktanın bu poligonun içinde mi yoksa dışındamı sorusuna cevap için eğimleri kontrol etmek gerekir.

Bunun için;

Poligonda sıra ile komşu kenarlar yani çakışık kenarlar ele alınır.
Her bir kolun eğimi hesaplanır. Test noktasının eğimi, hesaplanan iki eğimin arasında yada bunlara eşit olmalıdır. (Not1*)

Bu test her bir komşu iki kenar için yapıldığında, test noktası tüm testleri geçerse bu nokta poligonun içindedir kararına varılır.

Ancak eğim hesabı floating formatta sonuç vereceğinden algoritma bu haliyle etkili (mükemmel) kullanılamaz.
Buna çözüm olarak algoritma tamamen fixpoint sayılarla çalışacak şekle sokulabilir fakat bu durumda algoritma public olmaktan çıkar. ;D
Öte yandan;

Not1 olarak yaptığım açıklama, bu algortimanın çuvallayacağı karmaşık poligonlar için geçerli değil. Bu nedenle genelleme yapılacak daha baba bir algoritma için biraz daha fazla kafa yormak gerekiyor.

Örneğin. İlk okulda öğrendiğimiz şekilde iç içe geçmiş A harflerinden bayrağımızdaki yıldızı yapar ve test noktasını poligonun içinde olacak şekilde köşelerden birisine çok yakın seçersek yukarıdaki test başarısız olur.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com