Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как совместить две фигуры 
:(
    Опции темы
oson
Дата 7.11.2009, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



Подскажите плиз. Есть Rectangle2D и есть несколько фигур Ellipse2D.
Собственно это area на которой располагаются окружности. Нужно, чтобы показывались только те окружности, которые входят в эту area.
Если например окружность с краю, то должна показаться только часть ее, та, которая попадает в area. Если даже центр окружности находится за пределами area, но часть окружности все же попадает в нее, то эту чать надо отобразить. Как сделать такую операцию над этими фигурами? Для окружности мы имеем только координаты центра и диаметр, и создаю ее
new Ellipse2D.Float(center.getX(), center.getY(), diameter, diameter);
Как теперь мне не показывать те точки, что выходят за прделы area - считать чтоли все пиксели по окружности и внутри и удалять лишние? Это не вариант. Есть какой-то подход в Java2D к такой операции?  
PM MAIL   Вверх
dorogoyIV
Дата 8.11.2009, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(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);
 }
}

PM MAIL   Вверх
Temdegon
Дата 8.11.2009, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: нет
Всего: 9



Возможно я не правильно понял, что вам нужно сделать. Гляньте метод Graphics.setClip(...), мне кажется это то что вам нужно. этот метод задает область прорисовки.
PM MAIL   Вверх
oson
Дата 8.11.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



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

Temdegon, а есть примерчик как с этим клипом работать. Похоже это оно.
PM MAIL   Вверх
dorogoyIV
Дата 8.11.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(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);
 }
}

PM MAIL   Вверх
oson
Дата 8.11.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



Так мне панели вообще как бы не нужны - мне на выходе не свинг получить надо а чисто картинку, 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;


PM MAIL   Вверх
dorogoyIV
Дата 8.11.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



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

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

 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.