Ořezání úsečky a antialiasing – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ořezání úsečky a antialiasing – Java – Fórum – Programujte.comOřezání úsečky a antialiasing – Java – Fórum – Programujte.com

 

Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
17. 11. 2008   #1
-
0
-

Zdravím,

Nevíte někdo jak naprogramovat v C++ (openGL) nebo v Javě antialiasing úsečky na základě interpolace intenzity a nebo možná jednodušší věc: Cohen-Sutherland (algoritmus ořezávání úsečky).

Ve Wikipedii jsem k algoritmu ořezávání úsečky něco našel, ale zdrojový kod mi negunguje :-(

Děkuji.

Nahlásit jako SPAM
IP: 88.101.6.–
KIIV
~ Moderátor
+43
God of flame
17. 11. 2008   #2
-
0
-

ted nechapu... snazis se o orezani usecky nebo o antialiasing?

Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
18. 11. 2008   #3
-
0
-

No bud to nebo to. Ale spíše to ořezávání. To se mi zdá jednodušší. Nebo ne?

Nahlásit jako SPAM
IP: 89.103.136.–
MaSo0
Newbie
26. 11. 2008   #4
-
0
-

To Anonymní uživatel : Kolcun? :-)



import java.awt.image.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;

public class RasterizaceUsecky extends JFrame
{
private int pocetKliku = 0;
private int xP,yP,xK,yK, oknoMaxX = 700,oknoMaxY = 500, oknoMinX = 100, oknoMinY= 100;
private BufferedImage obrazek;
private JFrame f;
private WritableRaster raster;

public RasterizaceUsecky()
{
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
if( e.getButton() == MouseEvent.BUTTON1 )
{
++pocetKliku;
if (pocetKliku == 1)
{
xP = e.getX();
yP = e.getY();
}

if (pocetKliku == 2)
{
xK = e.getX();
yK = e.getY();
pocetKliku = 0;
obrazek = bresenham( xP, yP, xK, yK, Color.GREEN.getRGB());
if(cohenSuther()) obrazek = bresenham( xP, yP, xK, yK, Color.RED.getRGB());
repaint();
}
}

if( e.getButton() == MouseEvent.BUTTON3 )
{
obrazek = smazPlatno();
pocetKliku = 0;
repaint();
}
}
});

SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}

public BufferedImage smazPlatno()
{
raster = obrazek.getRaster();
for (int x = 0; x < 800; x++)
{
for (int y = 0; y < 600; y++)
{
obrazek.setRGB(x,y,Color.BLACK.getRGB());
}
}
nakresliOkno();
return obrazek;
}

public void nakresliOkno()
{
obrazek = bresenham( oknoMinX, oknoMinY, oknoMinX,oknoMaxY,Color.WHITE.getRGB());
obrazek = bresenham( oknoMinX, oknoMinY, oknoMaxX,oknoMinY,Color.WHITE.getRGB());
obrazek = bresenham( oknoMinX, oknoMaxY, oknoMaxX,oknoMaxY,Color.WHITE.getRGB());
obrazek = bresenham( oknoMaxX, oknoMinY, oknoMaxX,oknoMaxY,Color.WHITE.getRGB());
}

public BufferedImage bresenham(int xP, int yP, int xK, int yK, int barva)
{
raster = obrazek.getRaster();
int x = xP, y = yP, D = 0, HX = xK - xP, HY = yK - yP, c, M, xInc = 1, yInc = 1;
if (HX < 0)
{
xInc = -1; HX = -HX;
}
if (HY < 0)
{
yInc = -1; HY = -HY;
}
if (HY <= HX)
{
c = 2 * HX; M = 2 * HY;
for (;;)
{
obrazek.setRGB(x, y,barva);
if (x == xK) break;
x += xInc;
D += M;
if (D > HX)
{
y += yInc; D -= c;
}
}
}
else
{
c = 2 * HY; M = 2 * HX;
for (;;)
{
obrazek.setRGB(x, y,barva);
if (y == yK) break;
y += yInc;
D += M;
if (D > HY)
{
x += xInc;
D -= c;
}
}
}
return obrazek;
}

public void createAndShowGUI()
{
obrazek = new BufferedImage(800,600,BufferedImage.TYPE_3BYTE_BGR);
nakresliOkno();
setTitle("Rasterizace úsečky - Martin Sobek");
Icon icon1 = new ImageIcon(obrazek);
JLabel label1 = new JLabel(icon1);
getContentPane().add(label1);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
toFront();
pack();
setVisible(true);
setResizable(false);
setSize(800,600);
new JOptionPane().showMessageDialog(
this, "Myší zádávejte počáteční a koncový bod úsečky. Pravý klik pro výmaz plátna.");
}


private int priradKod(int x, int y)
{
int kod = 0;
if (x < oknoMinX) ++kod;
else if (x > oknoMaxX) kod |= 2;

if (y > oknoMaxY) kod |= 4;
else if (y < oknoMinY) kod |= 8;

return kod;
}

public boolean cohenSuther()
{
int pocKod = priradKod(xP, yP);
int konKod = priradKod(xK, yK);

for (int i = 0; i < 4; i++)
{
if ((pocKod | konKod) == 0) return true;
else if ((pocKod & konKod) != 0) return false;

if (pocKod == 0)
{
int buf1 = pocKod; pocKod = konKod; konKod = buf1;
int pomX = xP;
int pomY = yP;
xP = xK;
yP = yK;
xK = pomX;
yK = pomY;
}

if ((pocKod & 1) == 1) //zleva
{
yP = yP + (yK - yP) * (oknoMinX - xP) / (xK - xP);
xP = oknoMinX;
}
else if ((pocKod & 2) == 2) //zprava
{
yP = yP + (yK - yP) * (oknoMaxX - xP) / (xK - xP);
xP = oknoMaxX;
}
else if ((pocKod & 4) == 4) //spodek
{
xP = xP + (xK-xP) * (oknoMaxY - yP) / (yK - yP);
yP = oknoMaxY;
}
else if ((pocKod & 8) == 8) //vrch
{
xP = xP + (xK - xP) * (oknoMinY - yP) / (yK - yP);
yP = oknoMinY;
}
pocKod = priradKod(xP,yP);
}
return true;
}



public static void main(String[] args)
{
RasterizaceUsecky a = new RasterizaceUsecky();
}
}

Nahlásit jako SPAM
IP: 94.112.93.–
Real programmers use: copy con program.exe...
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
9. 12. 2008   #5
-
0
-

To MaSo. Ano Kolcun :-D
Tohle přišlo pozdě, vyřešil jsem to jinak, ale přece děkuji. Můžu srovnávat.

A jen tak mimochodem, ted asi něco těžžího. Jak udělat Z-buffer a vykreslení s rovinami a dvěma koulemi. (použitá by měla být kolmá projekce. A pokud možno ještě aplikovat Phongův osvětlovací model s difúzním povrchem). Ted jsem asi opravdu v pasti. Jak mám tohle naprogramovat, to tedy netuším. Kdyby někdo věděl tak díky. Klidně můžeme komunikovat přes email: starcr@email.cz --- ODMĚNA JISTÁ :-)

Nahlásit jako SPAM
IP: 89.103.137.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 11 hostů

Podobná vlákna

Antialiasing — založil DT

Ořezání řetězce — založil Jan Kliment

Antialiasing textu — založil polygon

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý