[Java/math] 2D graphics package

Pagina: 1
Acties:

  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Voor een project op school moet ik een TrueType Font-editor schrijven. Natuurlijk heb ik ervoor gekozen om dat te doen in Java.

TrueType fonts bestaat uit Glyphs die beschreven worden aan de hand van enkele punten. Deze punten beschrijven dan een quadratische B-spline 8)7 (dit zijn een soort bezier-curves - voor hetgeen wat ik ertoch van versta)

In de standaard Java API 1.4.2 zitten al heel wat interessante classes en methods om bezier-curves te tekenen: oftewel een quadratische - 2de graads (met 1 controlpoint) oftewel 'cubic' - 3de graads (met 2 controlpoints).

Het probleem is nu om n-de graads curves te tekenen zodat er 'n' controlpoints gebruikt kunnen worden, zoals bij TrueType fonts gebruikt wordt.

Ik heb de API al een beetje verkend, maar ik vindt nergens iets om zoiets te tekenen.

Zijn er hier mensen die een goede library kennen voor dergelijke exotische, wiskundige dingen te tekenen en te manipuleren. Of eventueel een goede manier kennen om dit toch met de standaard Java JDK 1.4.2 te realiseren?

[/me]Is geen krak in wiskunde, dus zelf een dergelijke package beginnen schrijven lijkt mij geen goede optie :) . De tijd zal ik er waarschijnlijk ook niet voor hebben[/me]

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Feyd-Rautha schreef op dinsdag 16 november 2004 @ 14:20:
Natuurlijk heb ik ervoor gekozen om dat te doen in Java.
waarom is dat natuurlijk? ;)
TrueType fonts bestaat uit Glyphs die beschreven worden aan de hand van enkele punten. Deze punten beschrijven dan een quadratische B-spline 8)7 (dit zijn een soort bezier-curves - voor hetgeen wat ik ertoch van versta)
Hmm, ik dacht dat het cubic beziers (de standaard beziers dus) waren?
Het probleem is nu om n-de graads curves te tekenen zodat er 'n' controlpoints gebruikt kunnen worden, zoals bij TrueType fonts gebruikt wordt.
Het waren toch quadratische zei je net? Waarom wil je dan nu ineens n-de graads curves tekenen? Als het goed is zijn de curves zo gepositioneerd dat ze in elkaars verlengde liggen, muv de hoekpunten.

Bovendien red je het niet met simpelweg tekenen, die beziers definieren slechts de outline van een font. Tenzij dat ook echt is wat je wilt zul je dus een fill algoritme moeten schrijven (niet zo heel erg moeilijk, maar dat betekent dus dat je zelf de curves uit moet rekenen ipv dat je ze gewoon tekent). Beziers zijn an sich vrij simpel uit te rekenen, kwestie van interpoleren over een aantal iteraties :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
TrueType's curves are quadratic B-splines. Each spline is equivalent to a series of quadratic Bézier curves. And each of these is defined by 3 outline control points, rendered by a parametric, quadratic equation hard-coded into the rasterizer.

bron: http://www.truetype.demon.co.uk/ttoutln.htm
Inderdaad, mijn eerste post was nogal een beetje vaag. Ik heb net eens die truetype outlines wat beter doorgenomen.

Wanneer er meerdere off-curve points na elkaar voorkomen, wordt er een on-curve controlpoint geinterpoleerd zodanig dat we dus terug een quadratische bezier-curve krijgen.
Ik was verward: ik had een editor gedownload waarin er meerdere off-curve controlpoints waren. Maar nu begrijp ik dat er dus een 'onzichtbare' on-curve controlpoints tussen zit.

Afbeeldingslocatie: http://www.truetype.demon.co.uk/b-outln.gif

Ik zal maar eens een goede tutorial zoeken over deze materie. Misschien weet er iemand anders ook een goede...

[ Voor 39% gewijzigd door Feyd-Rautha op 16-11-2004 15:44 ]

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Maar iig, de (pseudo) code om een n-de graads bezier uit te rekenen:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
Point calcBezier (float t, Point[] controlpoints)
{
    Point[] buf = controlpoints.clone ();
    int num = buf.length;
    while (num > 1)
    {
        for (int i = 0; i < num - 1; i++)
            buf[i] = interpolate (buf[i], buf[i + 1], t);
        num--;
    }
    return buf[0];
}


En voor t geef je natuurlijk een waarde tussen 0 en 1, waarbij 0 het eerste controlpoint oplevert en 1 het laatste

[ Voor 15% gewijzigd door .oisyn op 16-11-2004 15:38 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.