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.
Fórum › Java
Ořezání úsečky a antialiasing
No bud to nebo to. Ale spíše to ořezávání. To se mi zdá jednodušší. Nebo ne?
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();
}
}
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Á :-)
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žení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 47 hostů
Podobná vlákna
Antialiasing nebo ořezání úsečky — založil Otis
Antialiasing — založil DT
Ořezání řetězce — založil Jan Kliment
Antialiasing textu — založil polygon
Ořezání nul na začátku z dotazu na mysql — založil pidgin
Moderátoři diskuze