El yazımı kodlama tekniğim
(amygoodchild.com)- JavaScript blok harf alfabesi üreticisinden yola çıkıp, iki ay sonra bitişik el yazısını da kodla üretme sürecini anlatıyor
- Harfler, p5js aracıyla ana koordinatlar işaretlenip Chaikin eğrisiyle yumuşatıldıktan sonra değişken kalınlıklı yollara dönüştürülüyor
- Bitişik yazıda her harf çifti farklı bağlandığı için, yolun başlangıç ve bitişine 0~3 etiketleri eklenerek bağlanamaz, taban çizgisi, taban çizgisinin üstü ve x-height yakını durumları ayırt ediliyor
- Kelime oluştururken her harf için 2~3 yoldan biri seçiliyor, komşu harfin bağlanma yüksekliğine göre noktalar eklenip siliniyor ya da değiştiriliyor, ardından Perlin noise ile hafif titreme ekleniyor
- Küçültmeden sonra bitişik el yazısı harf sınıfı 26.1kb olup, blok harflerin 9.7kb boyutundan daha büyük; bunun nedeni birden çok yol ve komşu harf düzeltme fonksiyonları
Blok harf üretim yönteminden bitişik el yazısına genişletme
- Önceki blok harf alfabesi üreticisinde her harf yolunun ana noktaları kodla tanımlanıyordu
- Her harf için yaklaşık 10 nokta yerleştiriliyordu
- Chaikin eğrisi algoritmasıyla yol yumuşatılıyordu
- Yol, uzunluğu boyunca kalınlığı değişen bir biçime dönüştürülüyordu
- Son biçim p5js ile çiziliyordu
- Blok harflerde koordinatlar doğrudan koda yazılıyor, harf doğal görünene kadar noktalar elle ayarlanıyordu
- Bitişik el yazısı uygulamasında bu tekrar eden işi azaltmak için ayrı bir harf tasarım aracı yapılmış
p5js içinde harf yolu tasarlama aracı
- p5js editöründe ana noktaları tanımlayıp dışa aktaran bir araç oluşturulup kullanılmış
- Araç, ölçeği ve bağlamı gösteren örnek harflerle yeni harfin tasarlanacağı alanı birlikte sunuyor
- Tıklayarak yolun ana noktaları yerleştirildiğinde Chaikin eğrisi uygulanmış sonuç gösteriliyor
ptuşuyla düzenleme moduna geçiliyor- Bir nokta seçilip sürüklenerek konumu ayarlanıyor
entertuşuyla yol konsola yazdırılıyor
- Her harf için 2~3 seçenek oluşturulmuş ve ortaya çıkan yol
{x, y}koordinat dizisi biçiminde oluyor - Kendi el yazısını temel almak için küçük ve büyük harf örneklerini bizzat yazıp, bu görseli harf üretim aracına yükleyerek üzerinden geçmiş
w/a/s/dtuşlarıyla görsel taşınıyorr/etuşlarıyla görsel büyütülüp küçültülüyor- Kağıda yazılan sayılar, ilgili alanı harf üretim penceresine hizalamak için kullanılan x/y koordinatları
Bitişik el yazısı bağlantı sorunu ve 0~3 etiketleri
- Bazı harf çiftlerinde, bir harfin ana nokta yolunun sonuna sonraki harfin yolunu ekleyip Chaikin eğrisini tek seferde uygulamak doğal bir bağlantı sağlıyor
- Ancak bazı kombinasyonlarda bağlantı çizgisi harfin biçimini bozuyor
nadurumundanharfinin son noktası alçak,aharfinin ilk noktası yüksek olduğundan bağlantı çizgisiaharfinin içinden çapraz geçip onuegibi gösterebiliyortidurumundattaban çizgisinin hemen üstünde biterkenitaban çizgisinden başladığı için yapay bir sırt oluşuyor
- Her özel harf çifti için kural yazmak yerine, her yolun başlangıç ve bitişine bağlantı yüksekliği bilgisi sayı olarak eklenmiş
0: Diğer harflerle bağlanamaz1: Diğer harflerle taban çizgisi civarında bağlanır2: Diğer harflerle taban çizgisinin hemen üstünde bağlanır3: Diğer harflerle x-height civarında bağlanır
- Aynı harfte bile kelimenin başında olup olmamasına ya da önündeki ve arkasındaki harflere göre nokta ekleme/silme yöntemi değişebiliyor
akelimenin başındaysa ek bir nokta tuhaf görünebiliyorwsonrasındakiaiçin çizgiaharfini başka bir şekilde kesebiliyort,kile bağlandığında biçimi değişebiliyor
- Tüm harf çiftleri test edilmiş ve birden fazla yol seçeneğiyle komşu harfe göre düzenlemeler kullanılarak çeşitlilik üretilmiş
- İdeal olarak her harf için 5~6 yol seçeneği isteniyor, ancak dosya boyutuyla denge kurulması gerekiyor
Kelime üretim süreci
- Kelime oluştururken önce her karakter için 2~3 temel yoldan biri seçiliyor
- Seçilen yolun başlangıç ve bitiş bağlantı bilgisi komşu harflere aktarılıyor
- Aynı harfte bile seçilen yol seçeneğine göre bitiş noktası bilgisi değişebildiğinden, önce tüm harf yollarının seçilmesi gerekiyor
- Ardından temel yol komşu harflere göre ayarlanıyor
- Önceki harfin bitiş yüksekliği
2ise mevcut yolun başlangıç noktasından biri kaldırılabiliyor - Sonraki harfin başlangıç yüksekliği
1ise belirli bir konuma nokta eklenebiliyor
- Önceki harfin bitiş yüksekliği
- Ayarlama fonksiyonları her harfte farklı çalışıyor
qiçin ayarlama fonksiyonu %70 olasılıkla sona bir kopukluk ekliyor ve önceki harfin bitiş bilgisi ya da sonraki harfin başlangıç bilgisine göre noktaları değiştiriyor veya ekliyorniçin ayarlama fonksiyonu, sonraki harf3seviyesinden başlıyorsa %30 olasılıkla kopukluk oluşturuyor ya da son noktayı taşıyor
- Tüm harflerin temel yolları birleştirilirken
1,2,3yok sayılıyor;0geldiğinde yeni bir yol başlatılarak kopukluk oluşturuluyor - Birleştirilen yola Chaikin eğrisi uygulanıyor, ardından değişken kalınlıklı bir şekle dönüştürülüyor ve Perlin noise ile hafif bir titreme ekleniyor
Boyut ve kullanım biçimi
- Blok harfler için harf sınıfı 9.7kb iken, küçültülmüş bitişik el yazısı harf sınıfı şu anda 26.1kb
- Bitişik el yazısı tarafının daha büyük olmasının nedeni, her harf için birden fazla yol bulunması ve komşu harflere göre noktaları ayarlayan fonksiyonların yer alması
- Daha fazla küçültme için fikirler de duruyor
- Şu anda harfler varsayılan 20 punto temel alınarak tasarlanıp sonra yeniden boyutlandırılıyor
- Bu yüzden
x: 14.5gibi çok sayıda koordinat var - Temel boyut 200 yapılırsa
145gibi değerlerle ondalıklar kaldırılıp harf başına yer kazanılabilir - Bu değişiklik dikkat gerektirdiği için sonraki işler listesinde duruyor
- Bu el yazısının başlıca kullanım alanı, üzerinde çalışılan diyagramın başlıkları, etiketleri ve karalama notları
- Font yerine kodlanmış yollar kullanmak, harflerin konumunu ya da tek tek harflerin iç kalınlığını doğrudan değiştirerek yolu manipüle etmeyi mümkün kılıyor
- Bu el yazısı kodunun gelişmiş bir sürümünü kullanan
Meaningful Nonsensebaskısı da sunuluyor ve her baskı sipariş anında üretilen benzersiz bir çıktı oluyor
1 yorum
Hacker News yorumları
El yazımı kodlarsam, sanırım tek yönlü hash sayılabilir.
Sonradan okuyunca ne yazmaya çalıştığımı çözmenin hiçbir yolu olmuyor.
Stuff Made Here'ın benzer bir konuyu ele alan YouTube videosu epey güzel: https://www.youtube.com/watch?v=cQO2XTP7QDw
Deneme-yanılma sürecini de anlattığı için izlemesi keyifliydi; el yazısı sentezi deposu da ilginç: https://github.com/sjvasquez/handwriting-synthesis
Sondaki sanat çalışması oldukça güzel.
Bir sonraki adımın bunu gerçek bir yazı tipine dönüştürüp herhangi bir programda yazılabilir hâle getirmek olup olmayacağını merak ediyorum.
Bizim genelde düşündüğümüz yazı tiplerinden farklı olarak, doldurulacak konturlar değil, izlenecek yollar olmaları gerekiyor.
Ama elle yapmak gerekiyorsa ya da öyle yapmak isterseniz sıkıcı olabilir.
Harf bağlantılarının uymadığı kısmı pek anlamadım.
Bana göre bitişik el yazısının özü kalemi kâğıttan kaldırmamaktır; bu yüzden harfleri birleştirme biçimi en baştan yazma eyleminin içindedir.
Yazar aslında böyle yazmadığı için sorun çıkmış gibi görünüyor.
Yine de yazı tipine dokunmadan ekranda birden çok harf çizmenin en basit yoluyla çözülen yazının geri kalanı çok ilginç.
Bitişik el yazısında harfler arasındaki bağlantılar bağlama bağlıdır.
Örneğin
bharfinden sonraamı yoksaomu geldiğine göre okunabilirlik için şekil değişebilir; bir kelimenin içinde bile bazı durumlarda harfler arasında kalemi kaldırmak isteyebilirsiniz.Yine de bu, bitişik el yazısının “kurallarını” çiğnemek değildir.
Farklı öğrenmiş olabilirsiniz ve o öğreti de doğru olabilir, ama bağlantıların bağlama bağlı olmaması gereken bir bitişik el yazısı biçimini pek bilmiyorum.
Bağlantısız yazı tiplerinde bile kerninge benzer şekilde, çeşitli harf dizilerinin nasıl görüneceğini kodlamak gerekir.
Çok güzel! Daha fazla bitişik el yazısı yazı tipi olmasını isterdim.
2 yıl önce yaptığım çalışma burada: https://certik.github.io/slabikar-otf/
Harika ama keşke yazım, kendi yazı tipimi yapmak isteyecek kadar iyi olsaydı :)
< 14.5yerine varsayılan boyutu 200 yaparsanız noktayı 145 olarak tanımlayabilirsiniz; böylece bir ondalık karakter azaltılabilir.adjustadlı bir fonksiyon görüyorum; yazı tipi spesifikasyonunu iyi bilmiyorum ama0,{x:12.2,y:13.2}ifadesini0,[12.2,13.2]gibi farklı serileştiripadjustfonksiyonunda dönüştürmek nasıl olur diye düşündüm.