poligon dan kurva

Upload: eneng-nani

Post on 28-Feb-2018

278 views

Category:

Documents


3 download

TRANSCRIPT

  • 7/25/2019 Poligon Dan Kurva

    1/19

    GrafikaKomputerPertemuanKe-10

    BAB-9POLIGON

    dan

    KURVA

    Poligonadalahbentukyangdisusundariserangkiangaris.Kurva

    Bezier

    digunakan

    untuk

    membentuk

    garis

    lengkung

    menggunakanalgoritmaBiezer.

    By:IGustiNgurahSuryantara,S.Kom.,M.Kom

    9.1.PENDAHUUANPoligonadalahbentukyangdisusundariserangkaiangaris.Gam!ar9.1memperlihatkanbeberapabentukpoligon.Titiksudutdaripoligondisebutvertexsedangkangar

    ispenyusunpoligondisebutedge.

    Gam!ar9.1.Gambarsebuahpoligon.

    DariGam!ar9.1.dapatdisimpulkanbahwasebuahpoligonselalumempunyaidasar:1.Jumlahvertex.

    2.Koordinatvertex.

    3.Datalokasitiapvertex.

    11

  • 7/25/2019 Poligon Dan Kurva

    2/19

    GrafikaKomputerPertemuanKe-10

    Poligondigambardenganmenggambarkanmasing!masingedgedengansetiapedge

    merupakanpasangandarivertexi"vertexi#1ke$ualiuntukedgeterakhirmerupaka

    n

    pasangandarivertexn"vertex1.

    %perasi

    yang

    dapat

    dikenakan

    pada

    sebuah

    poligon

    antara

    lain:1.

    &enginisialisasi

    poligon.

    'nisialisasi

    terhadap

    poligon

    perlu

    dilakukan

    untu

    kmengaturagarfieldvertnumberisi(.

    2.&enyisipkanvertex.&enyimpanin)ormasitentangvertexdanmenyesuaikan

    in)ormasitentang*umlahvertexdenganmenambahkansatukevertnum.

    3.&enggambarpoligon.&engun*ungivertexsatupersatudanmenggambaredge

    dengankoordinat+vertexi.x,vertexi.y-"+vertexi#1.x"vertexi#1.y-darivertexnomorsatusampaivertnum!1.khususuntukedgeterakhirmempunyaikoordinat

    +vertexvertnum.x,vertexvertnum.y-"+vertex1.x"vertex1.y-..mewarnaipoligon.&engisiareayangdibatasiolehedgepoligondenganwarna

    tertentu.

    9.".

    MENGISI

    P#IG#N/dabeberapaalgoritmayangdapatdigunakanuntukmengisiareadidalamsebuahpoligon./lgoritmatersebutantaralain:

    1./lgoritmaFloodFill.

    2./lgoritmaScanLineFill.3.nside!"utside#est.

    .$lgoritmaBoundray!Fill.

    Pada

    materi

    ini

    akan

    dibahas

    0lood

    0ill

    dan

    oundray

    0ill.

    9.".1.A$goritmaFloodFill/lgoritmayangpalingmudahuntukmengisipoligonadalahalgoritmaFloodfill./lgoritma inibeker*adengan$arapemakaimenentukanwarnapoligonserta lokasi titik

    yangmen*adititikawaldankemudianalgoritmaakanmemeriksatitik!titiktetangga

    ,

    apabilawarnatitiktetanggatidaksamadenganwarnaisipoligonmakatitiktersebutakandiubahwarnanya,prosestersebutdilan*utkansampaiseluruhtitikyangberadadidalam

    poligonselesaidiproses.Penentuan titik tetanggadapatmenggunakanmetode!koneksi

    atau

    !koneksi

    seperti

    pada

    gam!ar

    9.".

    +a-.!Koneksi +b-.!Koneksi

  • 7/25/2019 Poligon Dan Kurva

    3/19

    Gam!ar9.".%!koneksidan&!koneksi

    11

    GrafikaKomputerPertemuanKe-10

    /lgoritma mengisi poligon menggunakan )lood )ill dengan koneksi yang

    diimplementasikan

    se$ara

    rekursi)

    diperlihatkan

    pada

    listing

    berikut.

    VoidFloodFill(intx,inty,intfillColor,intoldColor)

    {

    If(getPixel(x,y)==oldColor)

    {

    setColor(fillColor);

    setPixel(x,y);

    FloodFill(x+1,y,fillColor,oldColor);

    FloodFill(x-1,y,fillColor,oldColor);

    FloodFill(x,y+1,fillColor,oldColor);

    FloodFill(x,y-1,fillColor,oldColor);

    }

    }

    Ketepatanalgoritma)loo)0illditentukanolehtitikawaldanapakahpoligonya

    ng

    diwarnaimerupakanpoligontertutup./pabilatidaktertutup,meskipunhanyasatutitik

    yangterbukamakapengisianakanmelebarkeareadiluarpoligon.

    9.".".A$goritmaS%anin&'i$$

    Void

    BoundaryFill(

    int

    x,

    int

    y,

    int

    fill,

    int

    Boundray)

    {

    Int

    current

    Current=getPixel(x,y);

    If

    ((current

    !=Boundray)

    &&

    (current

    !=

    fill))

    {

    setColor(fill);

    setPixel(x,y);

    Boundray

    (x+1,y,fill,

    Boundray);

    Boundray

    (x-1,y,fill,

    Boundray);

    Boundray

    (x,y+1,fill,

    Boundray);

    Boundray(x,y-1,fill,Boundray);

    }

    }

  • 7/25/2019 Poligon Dan Kurva

    4/19

    11

    GrafikaKomputerPertemuanKe-10

    9.(.

    KU)*AKali

    ini

    kita

    akan

    mempela*ari

    bagaimana

    membuat

    kurva

    menggunakan

    algoritmae4ier./lgoritmamembuatkurvabe4ierdiusulkanolehseorangahlimesindariperan$is

    yangbeker*adiperusahaan5enaultdandigunakanuntukmeran$angbadanmobil.

    9.(.1.Kur+aB&i&rKitasudahmempela*aribagaimanamembentukgarislurus,sepertidenganmenggunakanalgoritmaDD/danalgoritmaresenham.Padabab inikitaakanmembahaspembuatan

    kurva.Pembuatankurvayangakandibahasdenganmenggunakanalgoritmayan

    g

    diusulkan

    oleh

    e4ier.Pierre

    e4ier

    seorang

    ahli

    mesin

    peran$is

    yang

    beker*

    a

    diperusahaanrenult.e4ierlahirpadatanggal16eptember171(danmeninggalpadatgl289ovmber1777.e4ie

    r

    memperolehgelardalambidangmekanikaldari'cole

    (ationaleSuperieured)Seniet*etierstahun173(.elar

    keduadibidangelektropadatahun1731di'coleSuperieured)'lectricite,dandoktorpadatahun17bidang

    matematik

    dari

    +niversitas

    Paris.

    'a

    beker*a

    untuk

    renult

    dari

    1733!178,di

    mana

    dia

    mengembangkan

    ;9'6;50

    ;6D

  • 7/25/2019 Poligon Dan Kurva

    5/19

    Dank0

    n

    xk

    Bk/n

    ,u-

    y,u- >ykBk/n,u-k0

    rumus

    !

    6alahsatukelemahankurvae4ieradalahkurvayangdihasilkantidakdapatse$araketatmengikutibentukdarititikkontrolsehinggadapatmerepotkanbilakitainginmembuat

    bentukkurvatertentukarenamembutuhkantitikkontrolyanglokasinyaber*auhan.

    A/IHAN=itung+x,y-koordinatkurvabe4ieryangmemiliki titikkontrolyaitup(+(,(-,p1+1,2-,p2++3,3-danp3+,(-.

    0AAB;ntukempatpointkontrol,n@3

    Aangkahpertamahitungseluruh)ungsiblending,knuntukk!(,...,nmenggunaka

    nrumus:

    n?k

    k?.+n!k-?

    3?

    (3+u-@!!!!!!!!u(+1!u-

    [email protected]

    (+1!u-

    3@213u4

    (

    (?.3?

    3?

    13+u-@!!!!!!!!u1+1!u-

    [email protected]

    1+1!u-

    2@(u.213u4

    "

    1?.2?

    3?

    kn+u-@

  • 7/25/2019 Poligon Dan Kurva

    6/19

    23+u-@!!!!!!!!u2+1!u-

    [email protected]

    2+1!u-

    1@(u

    "213u4

    2?.1?

    3?

    33+u-@!!!!!!!!u3+1!u-

    (@1.u

    3+1!u-

    (@u

    (

    3?.(?

    12(

    GrafikaKomputerPertemuanKe-10

    Kitadapatmelihatbahwa)ungsi!)ungsiinisangatsederhana.6emuanyainiidentikuntuksemuabelokanpadakurvabe4ierdenganptitikkontrol.6ekarangkitasiapunt

    uk

    menghitungpadapointmelengkung.Parameteruselalumengalamiperubahandari(

    sampaidengan1.u@(berkitandengantitikawallengkungan+titikkontrolpertama-Bu1

    berkaitan

    dengan

    titik

    akhir

    lengkungan

    +titik

    kontrol

    terakhir-.

    Kita

    hanya

    memutuskanpada*umlahlangkah!langkahanaranilai(samapi1,dandarinilaiuntukmenghitun

    gpeningkatanDu,

    yang1C+*umlahlangkah"1-.&akinbesar+banyak-*umlahlangkah!

    langkahyangdiker*akankurvamakinhalusakantetapisemakinlambatdalamproses

    perhitungan+menggambar-.

    Pada$ontohini*umlahlangkahyangharusdiker*akansebanyak,makadu@1C+!1-@

    1C8@(,2.(,2sebaginilaistepsyangbergerakdai(.(,(.2,(.sCd1.Denganlangkahbelokan

    +lengkung-

    akanmemiliki

    koordinat.Kordinat!kordinatyang

    dihasilkan

    akan

    digabungdengansegmengaris.

    &arikitamenghitungtitikkontrolberdasarkanalgoritmayangsederhanaini.

  • 7/25/2019 Poligon Dan Kurva

    7/19

    121

    GrafikaKomputerPertemuanKe-10

  • 7/25/2019 Poligon Dan Kurva

    8/19

    122

    GrafikaKomputerPertemuanKe-10

    Mo5u$Untu6Kur+aB&i&rD&ngan*BPublic

    Type

    POINTAPIX

    As

    Long

    YAsLong

    EndType

    PublicDeclareFunctionPolyBezierLib"gdi32"(ByValhdcAsLong,lppt

    As

    POINTAPI,

    ByVal

    cPoints

    As

    Long)

    As

    Long

    Public

    P(0

    To

    3)

    As

    POINTAPI

    'draws

    a

    single

    Bezier

    curve

    segment

    with

    4

    control

    points

    FunctionDrawBezierCurve(CanvasAsPictureBox,P()AsPOINTAPI,Steps

    AsInteger)

    Dim

    i

    As

    Integer

    Dim

    j

    As

    Integer

  • 7/25/2019 Poligon Dan Kurva

    9/19

    DimuAsSingle

    Dim

    B(0

    To

    3)

    As

    Single

    Dim

    Q()

    As

    POINTAPI

    'calculateBeziercurve'Steps=Form1.SlidNilaiU.Value

    ReDimQ(0ToSteps)

    Fori=0ToSteps

    u

    =

    i

    /

    Steps

    'Bernstein

    cubic

    polynomials

    123

    GrafikaKomputerPertemuanKe-10

    B(0)

    =

    (1

    -

    u)

    ^

    3

    B(1)=3*u*(1-u)^2

    B(2)

    =

    3

    *

    u

    ^

    2

    *

    (1

    -

    u)

    B(3)

    =

    u

    ^

    3

    For

    j

    =

    0

    To

    3

    Q(i).X

    =

    Q(i).X

    +

    P(j).X

    *

    B(j)Q(i).Y

    =

    Q(i).Y

    +

    P(j).Y

    *

    B(j)

    Next

    j

    Form1.ListView2.ListItems.Add

    ,

    ,

    Format(u,

    "0.##")

    Form1.ListView2.ListItems(Form1.ListView2.ListItems.Count).SubItems(1)=

    Q(i).X

    Form1.ListView2.ListItems(Form1.ListView2.ListItems.Count).SubItems(2)=Q(i).Y

    Next

    i

    'draw

    Bezier

    curveCanvas.CurrentX

    =

    Q(0).X

    Canvas.CurrentY=Q(0).Y

    Fori=0ToSteps

    Canvas.Line(Canvas.CurrentX,Canvas.CurrentY)-(Q(i).X,Q(i).Y)

    Next

    i

    End

    Function

    LAMPIRAN

    PROGRAM

    MENGISI

    POLIGON

    Dengan

    Visual

    C#include

    #include

    //for

    random

    numbers

    rand();

    #include

    #include"QuickCG.h"

    #include"Q3Dmath.h"

    using

    namespace

    std;

    template

    inline

    T0

    pow(T0

    a,

    T1

    b){return

    pow(a,

    T0(b));}

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

    // PUTCODEBELOWHERE

    //

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

  • 7/25/2019 Poligon Dan Kurva

    10/19

    //thefloodfillalgorithmsvoid

    floodFill4(int

    x,

    int

    y,

    Uint32

    newColor,

    Uint32

    oldColor);

    voidfloodFill8(intx,inty,Uint32newColor,Uint32oldColor);

    voidfloodFill4Stack(intx,inty,Uint32newColor,Uint32oldColor);

    voidfloodFill8Stack(intx,inty,Uint32newColor,Uint32oldColor);

    void

    floodFillScanline(int

    x,

    int

    y,

    Uint32

    newColor,

    Uint32

    oldColor);

    void

    floodFillScanlineStack(int

    x,

    int

    y,

    Uint32

    newColor,

    Uint32

    oldColor);

    12

    GrafikaKomputerPertemuanKe-10

    //the

    stack

    #definestackSize16777216

    intstack[stackSize];

    intstackPointer;

    //theauxiliaryfunctionsbool

    paint_drawLine(int

    x1,

    int

    y1,

    int

    x2,

    int

    y2,

    ColorRGB

    color);

    void

    clearScreenBuffer(ColorRGB

    color);

    //the

    graphics

    buffer

    #definescreenW256

    #define

    screenH

    256

    Uint32screenBuffer[screenW][screenH];

    int

    main(int

    argc,

    char

    *argv[])

    {

    screen(screenW,

    screenH,

    0,

    "Flood

    Fill");

    clearScreenBuffer(RGB_White);

    int

    mouseX,

    mouseY;

    intoldMouseX,oldMouseY;

    bool

    LMB,

    RMB;

    while(!done())

    {

    oldMouseX

    =

    mouseX;

    oldMouseY

    =

    mouseY;

    getMouseState(mouseX,mouseY,LMB,RMB);

    //3differentmouseinputactionsif(LMB)

    paint_drawLine(oldMouseX,

    oldMouseY,

    mouseX,

    mouseY,

    RGB_Black);

    if(RMB)

    {

    Uint32color=RGBtoINT(ColorRGB((mouseX%3+1)*64,

    (mouseY

    %

    8)

    *

    32,

    (mouseX

    +

    mouseY)

    %

    256));

    floodFillScanlineStack(mouseX,

    mouseY,

    color,

    screenBuffer[mouseX][mouseY]);

    }

    if(RMB&&LMB)clearScreenBuffer(RGB_White);

    //benchmarkreadKeys();

    if(inkeys[SDLK_SPACE])

    {

    floatstartTime=getTime();

    for(inti=1;i

  • 7/25/2019 Poligon Dan Kurva

    11/19

    float

    startTime2

    =

    getTime();

    for(inti=1;i0)

    {

    intp=stack[stackPointer];

    x

    =

    p

    /

    h;y

    =

    p

    %

    h;

    stackPointer--;

    return1;

    }

    else

    {

    return

    0;

    }

    }

    boolpush(intx,inty){

    if(stackPointer

  • 7/25/2019 Poligon Dan Kurva

    12/19

    while(pop(x,y));

    }

    /////////////////////////////////////////////////////////////////////////VariantsoftheFloodfillAlgorithm

    ///////////////////////////////////////////////////////////////////////

    12GrafikaKomputerPertemuanKe-10

    //Recursive4-wayfloodfill,crashesifrecursionstackisfull

    voidfloodFill4(intx,inty,Uint32newColor,Uint32oldColor){

    if(x>=0&&x=0&&y=

    0

    &&

    x

    =

    0

    &&

    y

    =denominator

    yinc2

    =

    0;

    //

    Don't

    change

    the

    y

    for

    every

    iteration

  • 7/25/2019 Poligon Dan Kurva

    17/19

    den=deltax;

    num=deltax/2;

    numadd

    =

    deltay;

    numpixels

    =

    deltax;

    //

    There

    are

    more

    x-values

    than

    y-values

    }

    131

    GrafikaKomputerPertemuanKe-10

    else//Thereisatleastoney-valueforeveryx-value{

    xinc2=0;//Don'tchangethexforeveryiteration

    yinc1=0;//Don'tchangetheywhennumerator>=denominator

    den=deltay;

    num=deltay/2;

    numadd

    =

    deltax;

    numpixels

    =

    deltay;

    //

    There

    are

    more

    y-values

    than

    x-values

    }

    for(curpixel=0;curpixel=

    den)

    //

    Check

    if

    numerator

    >=

    denominator

    {

    num

    -=

    den;

    //

    Calculate

    the

    new

    numerator

    value

    x

    +=

    xinc1;

    //

    Change

    the

    x

    as

    appropriate

    y

    +=

    yinc1;

    //

    Change

    the

    y

    as

    appropriate

    }

    x+=xinc2;//Changethexasappropriate

    y+=yinc2;//Changetheyasappropriate

    }

    return

    1;}

  • 7/25/2019 Poligon Dan Kurva

    18/19

  • 7/25/2019 Poligon Dan Kurva

    19/19

    132