Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: z - 04 Nisan 2012, 13:20:25

Başlık: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: z - 04 Nisan 2012, 13:20:25
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.
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: Kabil ATICI - 04 Nisan 2012, 14:12:28
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ı.
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: z - 04 Nisan 2012, 14:21:49
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.



Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: iyildirim - 04 Nisan 2012, 14:32:30
Ç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.

Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: z - 04 Nisan 2012, 14:48:37
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.

Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: iyildirim - 04 Nisan 2012, 15:18:06
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


Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: elektronikhobi - 05 Nisan 2012, 16:13:44
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 (http://www.metanetsoftware.com/technique/tutorialA.html)
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: muhittin_kaplan - 05 Nisan 2012, 16:25:16
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.
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: malpaslan1979 - 05 Nisan 2012, 16:56:53
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 (http://www.sonsivri.to/forum/index.php?topic=12027.0)
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: mufitsozen - 05 Nisan 2012, 17:04:52
open source PCB programi var, inceleyerek aradiginiz cevaplari bulabilirsiniz.

http://pcb.gpleda.org/pcb-cvs/pcb.html (http://pcb.gpleda.org/pcb-cvs/pcb.html)

Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: elektronikhobi - 05 Nisan 2012, 21:28:48
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 (http://www.youtube.com/watch?v=mbgjCcg0o6o#ws)

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ı  ;)
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: klax - 08 Nisan 2012, 11:18:52
benim cozemedigim bır konuda zoom olayını ve cızım alanı nasıl yapıyorlar
opengl ile arastırdım bulamadım
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: z - 16 Nisan 2012, 13:46:11
@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.)
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: iyildirim - 16 Nisan 2012, 17:43:31
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/ (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. 
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: z - 18 Nisan 2012, 12:55:30
@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.

Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: Tagli - 18 Nisan 2012, 13:01:58
kicad'in kodları incelenebilir.
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: z - 18 Nisan 2012, 13:24:47
Alıntı yapılan: mufitsozen - 05 Nisan 2012, 17:04:52
open source PCB programi var, inceleyerek aradiginiz cevaplari bulabilirsiniz.

http://pcb.gpleda.org/pcb-cvs/pcb.html (http://pcb.gpleda.org/pcb-cvs/pcb.html)

Hocam source kodları bulamadım. Nerede bu pcb programının kodları?

Alıntı yapılan: Tagli - 18 Nisan 2012, 13:01:58
kicad'in kodları incelenebilir.

Aynı şekilde Kicad kodlarını nereden bulacağım?
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: z - 18 Nisan 2012, 15:51:27
Bu kodlardan bana hayır yok. Bütüne hakim olmadan istediğim fonksiyonu çekip çıkartmam, buna ait değişkenleri ve bunların kimlerden etkilendiğini arayıp bulmam samanlıkta iğne aramak gibi.



Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: mufitsozen - 18 Nisan 2012, 17:00:40
Alıntı yapılan: z - 18 Nisan 2012, 13:24:47
Hocam source kodları bulamadım. Nerede bu pcb programının kodları?

http://pcb.gpleda.org/index.html (http://pcb.gpleda.org/index.html)
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: elektronikhobi - 18 Nisan 2012, 19:58:07
Aslında tam olarak bu kod bir nokta ile bir çokgenin kesişip keşişmediği test ediliyormuş. comp.graphics.algorithms.faq 2.03 numaralı sorudan aldım.

http://www.faqs.org/faqs/graphics/algorithms-faq/ (http://www.faqs.org/faqs/graphics/algorithms-faq/)

    int pnpoly(int npol, float *xp, float *yp, float x, float y)
    {
      int i, j, c = 0;
      for (i = 0, j = npol-1; i < npol; j = i++) {
        if ((((yp[i]<=y) && (y<yp[j])) ||
             ((yp[j]<=y) && (y<yp[i]))) &&
            (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))

          c = !c;
      }
      return c;
    }


Tabi bu şekilleri oluşturmak için nesneye yönelik bir programla dili kullanmak daha kullanışlı olur.

import vector2;
import sdl;

struct Nokta
{
    int x = 0;
    int y = 0;
    Renk renk;

    this (int x, int y, Renk = Renk.beyaz)
    {
        this.x = x;
        this.y = y;
        this.renk = renk;
    }
}

/* */

struct Dikdörtgen
{
    Vector!(int) konum;

    int genişlik;
    int yükseklik;
    Renk renk;

    this(Vector!(int) konum, int genişlik, int yükseklik, Renk renk = Renk.beyaz)
    {
        this.konum = konum;
        this.genişlik = genişlik;
        this.yükseklik = yükseklik;
        this.renk = renk;
    }
}


Örneğin bu da D ile yazılmış temel şekiller örneği.  Sonra çizici diye bir nesnemiz olabilir ve o da kendine verilen şekilleri çizebilir. Örneğin çizgi, dikdörtgen, çember vs.. gibi..

http://bit.ly/ILxOo7 (http://bit.ly/ILxOo7)
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: elektronikhobi - 18 Nisan 2012, 20:15:35
Bir de şöyle bir şey var çizgi çizmeyle ilgili. Çizgi için sadece iki noktanın koordinatlarını tutmak yeterli. Örneğin fare ile üzerine geldiğimizde farenin de iki koordinatını grafik kütüphanesi istediğimiz zaman bize verebiliyor.

Bir çizginin denklemi mx+n şeklinde. Yani grafiği direncin akım gerilim ilişkisi gibi. Aslında farenin koordinatlarını bildiğimize göre teorik olarak çizgi denkleminde bu noktayı kullanarak çizgi üzerinde karşılık gelen noktayı basitçe bulabiliriz. Ama pratikte çizgiyi çizmek için Bresenham'ın çizgi algoritması kullanılıyor. O yüzden aslında ekran piksellerden oluştuğu için çizgi aslında tam düz değil.

(http://www.webkinesia.com/games/images/bresen2.jpg)

Ama gene aynı mantıkla kullanıcının aslında nereye tıkladığını bu algoritmada yerine koyarak çizdirebiliriz.

http://free.pages.at/easyfilter/bresenham.html (http://free.pages.at/easyfilter/bresenham.html)

http://www.cs.toronto.edu/~smalik/418/tutorial2_bresenham.pdf (http://www.cs.toronto.edu/~smalik/418/tutorial2_bresenham.pdf)
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: z - 18 Nisan 2012, 21:50:11
@elektronikhobi

BMP formatinda bir dosyada herhangi bir egime sahip uc uca bagli cizgiler olsa yazilacak bir program bu cizgilerin herbirinin baslangic ve bitis koordinatlarini nasil bulur?

(http://www.cncdesigner.com/picproje/Cizgiler.GIF)

Mesela dosyamizda resimdeki gibi cizgiler olsa ve programimiz x1,y1,x2,y2....x5,y5 degerlerini bulsa.

Bu soruda nasil bir mantik yurutulur?
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: elektronikhobi - 18 Nisan 2012, 22:26:13
Ama o zaman bu işlem resim işlemeye girer.

Resim işleme de tamamen farklı bir şey. O konuyu da bilmiyorum  ::)

Örneğin wolfram alpha'ya böyle elle yazılmış bir formül vs.. verdiğiniz zaman onu okuyup gerekli hesaplamaları yapabiliyor.

Eğer bu bilgisayar ekranında bir çizim programında olsaydı. Örneğin nokta şeklinde bir nesne oluşturduğumuz zaman:

struct Nokta
{
     
    /* */
     
    this (int x, int y, Renk = Renk.beyaz)
    {
        this.x = x;
        this.y = y;
        this.renk = renk;
    }
}

dikkat ederseniz her Nokta nesnesinin kurucu işlevinde x ve y koordinatlarının geçerli bir değer alması sağlanıyor. Sonra nesneye yönelimli programlamanın bir kolaylığı olarak artık Nokta nesnelerinin her zaman geçerli olduğunu bildiğim için ik noktadan bir Çizgi nesnesi oluşturabilirdim.

struct Çizgi
{
    Nokta[2] Çizgi;

    this(Nokta bir, Nokta iki)
    {
        Çizgi = [bir, iki];
    }
}

Sonra Çizici nesnem de kendisine verilen bir çizgiyi şu şekilde çizebilirdi.

    void çiz(Çizgi çizgi, Renk renk = Renk.beyaz)
    {
      /**/
     }

Yani anlatmak istediğim bu işlemler bir baskı devre programında olsaydı. Bu değerleri bizim programımız çizgi nesnesi oluşturulduğu andan itibaren biliyor ve bunlar geçici bellekte tutuluyor. Program içinde o nesneyi oluşturduktan sonra oluşturduğumuz tüm nesnelerin koordinatlarını zaten biliyoruz. Bu bilgiler geçici bellekte tutuluyor. Bize sadece bu değerleri kullanmak kalıyor.
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: z - 18 Nisan 2012, 23:05:04
Alıntı YapAma o zaman bu işlem resim işlemeye girer.

Resim işleme de tamamen farklı bir şey. O konuyu da bilmiyorum

Yok oyle bu is resim islemeye girer deyip kenara cekilmek.

Cunku bir ustteki yazinda

Alıntı YapAma gene aynı mantıkla kullanıcının aslında nereye tıkladığını bu algoritmada yerine koyarak çizdirebiliriz.

demistin.

Bilmem alakayi kurdunmu? komsu noktalardan olusan bir dogru nerede egim degistiriyor gibi bir sorunun cevabi araniyor.
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: iyildirim - 19 Nisan 2012, 01:33:03
Çizgilerin  tek pixel genişliğinde olduğunu varsayıyorum.

Öncelikle bitmap i tarayıp  siyah bir pixel yakalanır.  Sonra iz takip edilerek çizgi izlenir. Bitmapin yapsında dolayı  0-90-45 lik eğimlerin dışında eğime sahip olan çizgiler 2sağa 1 yukarı gibi belli bi paterni takip ederek gider.
Ancak bu paterni direkt bitmap üzerinde aramak zor olacağından yüzlerce, binlerce de olsa küçük doğru parçaları oluşturmak daha kolay..
Sonra elimizdeki doğru parçalarını Douglas-Pecker gibi bir algoritmada işleyip bunu 0-90-45 den farklı bir eğime sahip tek bir doğru parçası haline getirmek mümkün..   
Douglas-Pecker de işlenirken birleştirilecek doğru uzunluklarını, açıları tanımlamak mümkün.. Yüzlerce dğru parçacığından 10 adet doğru veya abartılırsa tek bir doğru elde edilebilir. 


Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: z - 19 Nisan 2012, 12:06:15
Bir zamanlar bu konuyla ilgilenmiş ve bazı programlar yazmıştım. Ancak bu programlar vektörlerden bmpye gecmeyi ve milyonlarca pixelin komşuluk ilişkilerinin tek tek sınanmasını gerektiriyordu.

Durum böyle olunca da PC nin 3x4 cm ebatlarında bir pcb için sonuca ulaşması bile inanılmaz uzun süreler alıyordu.

Konuyu biraz daha açacak olursam,

Bir pcb çizdiğinizi varsayın. Bu pcbnin mekanik yöntemlerle kazınması işleminde ben yolun iki kenarından takım yarı çapı kadar uzaktan kazımak yerine komşı iki yolun tam ortasından geçen hattı kazıtıyordum.

Bunun için herhangi bir bakır noktacığın 4 bir yöndeki komşuluklarına bakarak kazıma yörüngesinin tespiti gerekiyordu.

Fakat bu işlemleri bmp yapmak dediğim gibi zaman alan bir işlemdi.

Örnek olarak 3x4 (cm) ebatlarındaki bşr PCB yi 20um çözünürlükteki mekanizma ile işlemek için gerberden bmpye geçiş yaptığımda

30000/20=1500
40000/20=2000

yani 1500x2000  yani 3milyon pixel ile çalışma gerekiyordu.

Çizilen bir PCB de asitle eritilecek kısımların alanını minumum yapacak algortima için konuşmak isteyenler varsa dinlemeye hazırım.

Konunun özü: Birbirinden izole komşu iki bakır yol arasındaki çizgiyi bulacak bir algoritma.



Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: iyildirim - 20 Nisan 2012, 02:37:55
@z, bu tip bir şey kazıma süresi açısından iyi olabilir, orijinali kazımaktan en az iki kat daha hızlı..  Ama PCB yi orijinal halinden uzaklaştıracak.
Mesela başka bir başlıkta çok yakın yollar, yüksek voltaj ve atlama gibi bir konu vardı.. 

Kendi adıma orijinal görünümlü PCB çıkartmayı tercih ederim, üstelik hesabı da daha kolay.. Ama bu benim tercihim.

Önce sanki sıfır kalınlıkta uçla kazıma yapacakmış gibi vertisler-doğru parçaları yönleri ile birlikte bulunur. 
Bunun için gerber çizildikten sonra bitmap  üzerinden çalışmakta olabilir, gerberin tarif ettiği, aperture lar ile çizilmiş parça parça geometrik şekilleri poligon olarak düşünüp, bu poligonlar toplanabilir de.

Toplanmış bir poligon bize bir Net' i tarif edecek. Poligonların yönleri örneğin CW olacak..
Bu durumda yönü Y ekseninde 90 derece yukarı olan doğru parçasının sağında bakır kalacağını  biliyoruz.  Poligonların hepsi CW olduğundan 90 derece yönü olan daha doğrusu y ekseninde pozitif yönü olan bir doğru parçasının karşısında yönü negatif olan bir doğru parçası olacak. En yakın negatif yönlü doğru üzerinde çalıştığımız doğru parçasının eşleğini olur.  Bu iki doğrunun ortasından çizilecek çizgi istediğimiz kazıma izi olmalı.

En yakın doğruyu bulmak nasıl olur?
Net bir fikrim yok ama aklıma birinci poligonun bir noktasında, bu noktaya komşu iki doğrunun oluşturduğu dış açının yönünde bir doğruyu açı noktasından pcb sınırına veya yeteri kadar uzun çizip, başka bir poligona ait ve negatif yönlü bir doğru ile keşisme noktası en yakın olan doğrudur gibi geliyor.   Kesişme noktası ile birinci poligona ait nokta arasındaki doğru parçasının ortası kazınacak yolun başlangıç noktası olacak.. Birinci poligonun bir sonraki noktası için de aynı işlem yapılıp  kazınacak yolun bir sonraki noktası bulunur.
Yanlışım yoksa bu şekilde PCB de izolasyon sağlanmış olur ancak gereksiz hatta hatalı kazımalar da olacak ve gereksiz boş adacıklar oluşacak..
Kazıma izlerinin optimizasyonu gibi birşeye de kafa yormak gerekir. En azından kazıma izleri  ile doğru parçalarının kesişmesine bakılıp kazıma izleri gerektiği yerde kesilmeli . Bu yöntemde özellikle çember parçası gibi şekiller yüzlerce doğru parçasından oluşacağından zaman açısından sıkıntı çıkabilir.

Birde bakır olmayan kısmı poligon olarak düşünüp bunun üzerinde işlem yapılabilir. Bu durumda kazıma izi bu poligonun içerisinde olacağından test edilecek doğru parçalarının sayısı daha az olur. Bu durumda yöntem içeriye bakan açılar üzerinden çalışmalı..

Kafa yormak lazım.. Zamanında bu konuda düşünüp, zor geldiği için hiç girmemiştim. Deiğim gibi orijinal PCB çıkartmanın hesabı-yöntemi daha kolay..
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: z - 20 Nisan 2012, 11:28:06
Bahsettiğim yöntem orjinal pcbyi kazımaktan 2 değil belki 20 kat daha hızlı. Çünkü büyük boyutu pcb kazımalarında kazıma yollarını kendim elle çizerek sayısız pcb yaptım. Kazınması gereken mesafe inanılmaz kısalıyor.

Yüksek frekansları bilemem ama 300v DC beslemeyle çalışan devrelerde yolların aralarını 0.3mm kazıyarak sorunsuz çalıştırdım.

Neden sorun çıkmadı? Çünkü 0.3mm hava boşlupu oluştu. Kazıma sonrası oluşan kanal, 0.3mm yol mesafesini uzattı. (Toz yada nem için iki  yol arasındaki mesafe kanal yüksekliğinin 2 katı kadar uzadı)

Ben bu tip kazıma yöntemini prototip yapma aşamasında tercih ediyorum. Gün içinde bir kaç farklı pcb kazıyıp deneme mak mümkün.

Üretim aşamasında zaten orjinal PCB bastırılacak.
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: iyildirim - 21 Nisan 2012, 05:36:18
Alıntı yapılan: z - 20 Nisan 2012, 11:28:06
Bahsettiğim yöntem orjinal pcbyi kazımaktan 2 değil belki 20 kat daha hızlı.


Gerbere uygun şekilde kazınıp, bakırı tam boşaltmayıp, tek geçişte kazıma yapıldğı duruma göre sizin yönteminiz en fazla 2 belki 2.5 kat hızlı olabilir.  Ayrıca ekstra hesap zamanı da var. 2 hız kat farkında anlaşalım.

Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: z - 21 Nisan 2012, 11:18:40
Alıntı yapılan: iyildirim - 21 Nisan 2012, 05:36:18

Gerbere uygun şekilde kazınıp, bakırı tam boşaltmayıp, tek geçişte kazıma yapıldğı duruma göre sizin yönteminiz en fazla 2 belki 2.5 kat hızlı olabilir.  Ayrıca ekstra hesap zamanı da var. 2 hız kat farkında anlaşalım.

Belki biraz abarttim belki de az soyledim.

Neden bu yonten daha hizli?

PCB uzerinde kesismeyen N yol olan bir bolumden kucuk bir kesit aldigimiz varsayalim.

Klasik usulde 2N tane, Bahsettigim metodda ise N+1 tane yol kazimasi yapmak gerekir.

2N / N+1 = ~ 2

Fakat sadece buradaki anlatima gore bahsettigim yontem 2 kat hizli demek yaniltir.

1) Pcb kazima isleminde z ekseni, kazima asamasinda once inmek kazima bitiminde ise kalkmak zorunda.

Bahsettigim yontemde z ekseni cok az sayida inip kalkma yapmak zorunda.

2) Kesici ucun, yolu paralel olarak izlemesi yerine,  elektrisel anlamda en kisa yoldan kazimasi yolu ve zamani kisaltmakta.

3) Sayet motorlara kumanda eden vector hesaplayici look a head algoritmasi kullanmiyorsa 2. maddeye bagli olarak surekli yon yada
egim degistiren her bir yolda  hizlan-sabit hizla git-yavasla-dur-hizlan-sabit hizla git-yavasla-dur  isleminindeki zaman kayiplari tamamen yok olmakta.

Bu nedenlerden dolayi bahsettigim yontem klasik yonteme kiyasla en az 20 kat daha hizlidir dedim.

Bu oran, pcb uzerindeki yollarin geometrisine ve dagilimina gore degisim gosterir.

(http://www.cncdesigner.com/picproje/kazi.gif)

Yukaridaki ornek pcb ciziminde siyah hatlar klasik usuldeki kazima hatlarini, kirmizilar ise benim bahsettigim yontemdeki kazima hatlarini gostermekte.

Fakat ilk hesaplama gercekten zaman aliyor. Kazima yollarinin nereden gececegini bilgisayara hesaplatmak yerine pcb ciziminden sonra ayri bir layera
kendim ciziyorum. Bu isi PC ye benden daha hizli hesaplatacagim gunler yakindir umarim.
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: elektronikhobi - 21 Nisan 2012, 12:43:07
Eğer çizim programında düğüm noktalarını çizit (graph) veri yapısı olarak modellersen bu mümkün. Tahminim baskı devre programları da bu işlemleri yapabilmek için çizit kuramdan faydalanıyorlardır.

(http://farm6.staticflickr.com/5115/7098452033_0c2e6d07eb.jpg) (http://www.flickr.com/photos/elektronikhobi/7098452033/)

Dijkstra ya da A* gibi bir algoritma kullanılabilir. Hatta çalışan bir örnek  :D

http://www.ehobi.org/yolbulma.zip (http://www.ehobi.org/yolbulma.zip)
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: muhittin_kaplan - 21 Nisan 2012, 16:00:15
Age Of Empires "Yaparım, Çiftci, Oduncu"
Başlık: Ynt: PCB çizim programlarının alt yapısı hakkında bilgisi olan varmı?
Gönderen: elektronikhobi - 21 Nisan 2012, 16:20:15
Aslında bu örneği aldığım kitapta böyle okçu, oduncu, süvari vs.. gibi oyun karakterlerinin yapay zekasının nasıl yapıldığı anlatılıyor. İlk bölümde madenci Bob amca ile karısının maceraları anlatılıyor.

Hatta 2D Fifa benzeri bir oyunun nasıl programlandığı anlatılıyor.

(http://farm6.staticflickr.com/5332/6952722552_fe77505894.jpg) (http://www.flickr.com/photos/elektronikhobi/6952722552/)

http://www.ehobi.org/futbol.rar (http://www.ehobi.org/futbol.rar)

Eğer grafik programlama ve yapay zekayla ilgileniyorsanız kesinlikle tavsiye ederim.

http://www.ai-junkie.com/books/toc_pgaibe.html (http://www.ai-junkie.com/books/toc_pgaibe.html)

http://amzn.com/1556220782 (http://amzn.com/1556220782)

Ama her zaman dediğim gibi grafik programlama gerçekten ama gerçekten zor  ::)