Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Как совместить две фигуры


Автор: oson 7.11.2009, 23:48
Подскажите плиз. Есть Rectangle2D и есть несколько фигур Ellipse2D.
Собственно это area на которой располагаются окружности. Нужно, чтобы показывались только те окружности, которые входят в эту area.
Если например окружность с краю, то должна показаться только часть ее, та, которая попадает в area. Если даже центр окружности находится за пределами area, но часть окружности все же попадает в нее, то эту чать надо отобразить. Как сделать такую операцию над этими фигурами? Для окружности мы имеем только координаты центра и диаметр, и создаю ее
new Ellipse2D.Float(center.getX(), center.getY(), diameter, diameter);
Как теперь мне не показывать те точки, что выходят за прделы area - считать чтоли все пиксели по окружности и внутри и удалять лишние? Это не вариант. Есть какой-то подход в Java2D к такой операции?  

Автор: dorogoyIV 8.11.2009, 03:17
Цитата(oson @  7.11.2009,  23:48 Найти цитируемый пост)
Если например окружность с краю, то должна показаться только часть ее

тут и думать не надо  smile 
Код

import java.awt.*;
import javax.swing.*;

public class Test extends JFrame
{
 public Test()
 {
  add(new Ovals());
  add(new JPanel(), "West");
  add(new JPanel(), "East");
  add(new JPanel(), "North");
  add(new JPanel(), "South");
 }

 public static void main(String [] args)
 {
  JFrame f = new Test();
  f.setBounds(100, 100, 800, 600);
  f.setDefaultCloseOperation(3);
  f.setVisible(true);
 }
}

class Ovals extends JPanel
{
 Ovals()
 {
  setPreferredSize(new Dimension(400, 300));
 }

 public void paintComponent(Graphics g)
 {
  g.drawOval(10, 10, 200, 100);
  g.drawOval(getWidth() - 100, 10, 200, 100);
  g.drawOval(0, getHeight() - 50, 200, 100);
  g.drawOval(getWidth() - 50, getHeight() - 50, 200, 100);
  g.drawOval(getWidth() / 2 - 50, getHeight() / 2 - 50, 100, 100);
 }
}

Автор: Temdegon 8.11.2009, 05:01
Возможно я не правильно понял, что вам нужно сделать. Гляньте метод Graphics.setClip(...), мне кажется это то что вам нужно. этот метод задает область прорисовки.

Автор: oson 8.11.2009, 13:04
dorogoyIV, так мне ж не фреймом надо ограничить область где прорисовываются окружности, а ректанглом внутри имейджа, причем без привязки к размеру самого имейджа и тем более к свингу. НУ а вообще спасибо smile

Temdegon, а есть примерчик как с этим клипом работать. Похоже это оно.

Автор: dorogoyIV 8.11.2009, 13:34
Цитата(oson @  8.11.2009,  13:04 Найти цитируемый пост)
так мне ж не фреймом надо ограничить область где прорисовываются окружности, а ректанглом внутри имейджа

так ты же делай каждую окружность внутри твоей панель. 
Код

import java.awt.*;
import javax.swing.*;

public class Test extends JFrame
{
 public Test()
 {
  setLayout(new FlowLayout());

  add(new MyOval(new Rectangle(0, 0, 100, 100), new Point(50, 50)));
  add(new MyOval(new Rectangle(0, 0, 100, 100), new Point(10, 0)));
  add(new MyOval(new Rectangle(0, 0, 100, 100), new Point(5, 10)));
  add(new MyOval(new Rectangle(0, 0, 100, 100), new Point(20, 20)));
 }

 public static void main(String [] args)
 {
  JFrame f = new Test();
  f.setBounds(100, 100, 400, 300);
  f.setDefaultCloseOperation(3);
  f.setVisible(true);
 }
}

class MyOval extends JPanel
{
 Rectangle r;
 Point center;

 MyOval(Rectangle r, Point center)
 {
  this.r = r;
  this.center = center;
  setPreferredSize(new Dimension(r.width, r.height));
 }

 public void paintComponent(Graphics g)
 {
  g.drawOval(center.x, center.y, r.width, r.height);
 }
}

Автор: oson 8.11.2009, 14:09
Так мне панели вообще как бы не нужны - мне на выходе не свинг получить надо а чисто картинку, image.
Temdegon, спасибо. setClip(Shape) - это именно то что я искал.
Код

  Rectangle2D.Double rect = new Rectangle2D.Double();
        Ellipse2D.Double oval1 = new Ellipse2D.Double();
        Ellipse2D.Double oval2 = new Ellipse2D.Double();
        Ellipse2D.Double oval3 = new Ellipse2D.Double();
        rect.setFrame(100, 100, 700, 700);
        oval1.setFrame(70, 70, 170, 170);
        oval2.setFrame(250, 250, 30, 30);
        oval3.setFrame(700, 500, 150, 100);

        g2d.setClip(rect);

        g2d.setColor(Color.GREEN);
        g2d.fill(oval1);
        g2d.fill(oval2);
        g2d.fill(oval3);

        g2d.setColor(Color.RED);
        g2d.setColor(Color.BLACK);
        g2d.setStroke(new BasicStroke(2f));
        g2d.draw(oval1);
        g2d.draw(oval2);
        g2d.draw(oval3);

        g2d.setColor(Color.BLUE);
        g2d.draw(rect);

        return g2d;


Автор: dorogoyIV 8.11.2009, 14:17
Цитата(oson @  8.11.2009,  14:09 Найти цитируемый пост)
мне на выходе не свинг получить надо а чисто картинку, image.

ну откуда же я знал?  smile 
Цитата(oson @  7.11.2009,  23:48 Найти цитируемый пост)
Нужно, чтобы показывались только те окружности, которые входят в эту area.

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)