Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2015, 22:59   #1
FatSlowpoke
 
Регистрация: 25.06.2013
Сообщений: 3
По умолчанию Система классов, графические примитивы и операции над множествами

Создаю систему классов для реализации графических примитивов на плоскости (круг, квадрат, треугольник) с реализацей операций над множествами
один класс-предок
и три класса-потомка, для каждой из фигур
вывод осуществляется посредством псевдографики
в программе должен быть реализован полиморфизм, так что возникла проблема с виртуальными функциями
а именно с функцией пересечения
понятия не имею как организовать ее работу правильно
отчаявшись, я здесь

Virtshape.cpp
Код:
#include <iostream>
#include <cmath>
#include "Virtshap.h"  
#include "msoftcon.h"
#include <conio.h>
#include "cstdlib"
using namespace std;


//ВИРТУАЛЬНАЯ ФУНКЦИЯ ПЕРЕСЕЧЕНИЯ
void shape::intersection(shape *pShapes)
	{
		set_fill_style(MEDIUM_FILL);
		set_color(cYELLOW);
		
}

//ВИРТУАЛЬНАЯ ФУНКЦИЯ ОБЪЕДИНЕНИЯ
void shape::integration()
	{}

//ВИРТУАЛЬНАЯ ФУНКЦИЯ РАЗНОСТИ
void shape::difference()
	{}

//ФУНКЦИЯ РИСОВАНИЯ КРУГА
void ball::draw()             
	{
		shape::draw();
		draw_circle(xCo, yCo, radius);
	}

//ФУНКЦИЯ ПЕРЕСЕЧЕНИЯ ДЛЯ КЛАССА ball
void ball::intersection(shape *pSh)
	{
		ball *pShapes=(ball *)pSh;
		
		for (int x = 0; x = 400; x++)
		{
			for (int y = 0; y = 400; y++)
			{
				if ((pow((xCo - x), 2) + pow((yCo - y), 2) <= pow(radius, 2)) &&
					(pow((pShapes[3].xCo - x), 2) + pow((pShapes[3].yCo - y), 2) <= pow(pShapes[3].radius, 2)))
				{
					
					set_cursor_pos(x, y);
					_putch('*');
				}
			}
		}
		
}

//ФУНКЦИЯ РИСОВАНИЯ ПРЯМОУГОЛЬНИКА
void rect::draw()
	{
		shape::draw();
		draw_rectangle(xCo, yCo, xCo + width, yCo + height);
	}

//ФУНКЦИЯ РИСОВАНИЯ ТРЕУГОЛЬНИКА
void tria::draw()             
	{
		shape::draw();
		draw_pyramid(xCo, yCo, height);
	}

main.cpp

Код:
#include <iostream>
#include <cmath>
#include "Virtshap.h"  
#include "msoftcon.h" 
#include <conio.h>
#include "cstdlib"
using namespace std;

int main()
{
	setlocale(LC_ALL, "Russian");
	int j;
	init_graphics();    //инициализируем графическую систему

	shape* pShapes[6];    //массив указателей на объекты типа shape

	pShapes[0] = new ball(20, 12, 5, cWHITE, MEDIUM_FILL);
	pShapes[1] = new rect(15, 7, 10, 15, cWHITE, MEDIUM_FILL);
	pShapes[2] = new tria(20, 7, 11, cWHITE, MEDIUM_FILL);
	pShapes[3] = new ball(30, 12, 5, cWHITE, MEDIUM_FILL);
	pShapes[4] = new rect(25, 7, 10, 15, cWHITE, MEDIUM_FILL);
	pShapes[5] = new tria(30, 7, 11, cWHITE, MEDIUM_FILL);

	cout << "Выберите фигуру:" << endl << "0 - круг" << endl << "1 - прямоугольник" << endl << "2 - треугольник" << endl;
	cin >> j;

	switch (j) 
	{
	case 0:
		pShapes[0]->draw();
		pShapes[3]->draw();
		break;
	case 1:
		pShapes[1]->draw();
		break;
	case 2:
		pShapes[2]->draw();
		break;
	default:
		cout << "Ошибка" << endl;
		break;
	}


	cout << endl << "Выберите операцию:" << endl << "0 - пересечение" << endl << "1 - объединение" << endl << "2 - разность" << endl;
	cin >> j;

	switch (j)
	{
	case 0:
		pShapes[0]->intersection(pShapes[3]);
		break;
	default:
		cout << "Ошибка" << endl;
		break;
	}

	for (j = 0; j<3; j++)          

		delete pShapes[j];
	set_cursor_pos(1, 25);
	_getch();
}

Virtshape.h

Код:
#include "msoftcon.h"

class shape                   //базовый класс
{
protected:
	int xCo, yCo;  
	color fillcolor;  
	fstyle fillstyle; 
public:

	shape() : xCo(0), yCo(0) {} 
	shape(int x, int y, color fc, fstyle fs) : 
		xCo(x), yCo(y), fillcolor(fc), fillstyle(fs) {}
	virtual ~shape() {}											
	virtual void draw() = 0										//чистая виртуальная функция
	{
		set_color(fillcolor);
		set_fill_style(fillstyle);
	}									
	virtual void intersection(shape *pShapes);   
	virtual void integration();									
	virtual void difference();									

};



class ball : public shape  //класс для круга
{
private:
	int radius;                                                  
	int* t, *l;
public:
	ball() : shape() {} 
	ball(int x, int y, int r, color fc, fstyle fs) :
		shape(x, y, fc, fs), radius(r) {} 
	void draw();
	void intersection(shapes *pSh);
	
};

	
	class rect : public shape  //класс для прямоугольника
	{
	private:
		int width, height;                                          
	public:
		rect() : shape(), height(0), width(0) {}                      
		rect(int x, int y, int h, int w, color fc, fstyle fs) : 
			shape(x, y, fc, fs), height(h), width(w) {}                
		void draw(); 
	
	};

	
	class tria : public shape  //класс для треугольника
	{
	private:
		int height;                                                       
	public:
		tria() : shape(), height(0) {}                                      
		tria(int x, int y, int h, color fc, fstyle fs) : 
			shape(x, y, fc, fs), height(h) {}                              
		void draw();
	
	};

Последний раз редактировалось FatSlowpoke; 29.05.2015 в 18:39.
FatSlowpoke вне форума Ответить с цитированием
Старый 29.05.2015, 08:46   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

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

Другой вариант - виртуальный метод, который проверяет находится ли данная точка внутри фигуры ну и далее каждая фигура знает свои точки и проверяет каждую из них (хотя с окружностю могут возникнуть проблемы).

Ну и третий вариант - запрашивать и фигуры ее тип и далее действовать в зависимости от тип фигуры. Например пересечения двух окружностей это одно а пересечение двух квадратов - другое.
waleri вне форума Ответить с цитированием
Старый 29.05.2015, 18:39   #3
FatSlowpoke
 
Регистрация: 25.06.2013
Сообщений: 3
По умолчанию

Ну я вообще изначально выбрала третий вариант
То есть я беру координаты двух окружностей, ищу их пересечение
И, если нахожу, то ставлю курсор в эту позицию и заполняю пересечение определенным символом и определенным цветом
Но, почему то, написанная мной функция для двух окружностей не работает
FatSlowpoke вне форума Ответить с цитированием
Старый 29.05.2015, 21:02   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от FatSlowpoke Посмотреть сообщение
Но, почему то, написанная мной функция для двух окружностей не работает
Может хоть функцию покажете?
По мне, так это самый сложный способ...
waleri вне форума Ответить с цитированием
Старый 29.05.2015, 22:46   #5
FatSlowpoke
 
Регистрация: 25.06.2013
Сообщений: 3
По умолчанию

наверное, Вы правы, потому что мне пришлось попотеть
но, к сожалению, переделывать уже поздно

вот функция
xCo, yCo - координаты центра окружности
координаты центра первого круга: 20, 15; радиус 6
координаты центра второго круга: 30, 15; радиус 6


Код:
void ball::intersection(shape *pSh)
	{
		
		shape::intersection(((ball*)(pSh)));
		ball *pShapes = (ball *)pSh;
		set_cursor_pos(0, 0);
		for (float x = 0; x <= 200; x++)
		{
			
			for (float y = 0; y <= 200; y++)
			{
				
				if ((pow((xCo - x), 2) + pow((yCo - y), 2) <= pow(radius, 2)) && (pow((ball(*pShapes).xCo - x), 2) + pow((ball(*pShapes).yCo - y), 2) <= pow(ball(*pShapes).radius, 2)))
				{
					set_cursor_pos(x, y);
					_putch('+');
				}
			}
		}
		
}

Последний раз редактировалось FatSlowpoke; 29.05.2015 в 23:44.
FatSlowpoke вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Операции над множествами olga_v95 Паскаль, Turbo Pascal, PascalABC.NET 3 11.02.2013 22:04
Операции над множествами(javascript) mashentsia2375 Помощь студентам 0 30.01.2013 20:45
Операции над множествами britva666 Помощь студентам 2 23.06.2009 20:33