Консультация № 184641
01.12.2011, 19:59
65.00 руб.
0 1 1
Здравствуйте! Прошу помощи в следующем вопросе: Помогите решить задачу С++ в консольном виде, с коментариями
Точка на экране в текстовом (или графическом режиме). Должны быть предоставлены возможности:
• высветить точку в определенном месте экрана определенным цветом;
• определить, видима ли точка в данный момент;
• получить координаты точки после поворота отрезка, соединяющего эту точку с началом координат, на заданный угол.
Описать класс и продемонстрировать его использование.

Обсуждение

Неизвестный
06.12.2011, 14:57
общий
это ответ
Здравствуйте, pavell!
Например, можно сделать так. Точка выводится в текстовом режиме точкой, цвет меняется как цвет текста консоли. Для поворота точки был применён рассмотренный здесь алгоритм (у нас как бы получается равнобедренный треугольник, одна вершина которого - начало координат, вторая - имеющаяся точка, и последняя - результирующая точка). Размер консоли принят за константу. Берётся не размер буфера, а именно размер окна. При желании, эти числа можно получить через winapi. Начало координат - приблизительно в центре консоли. Поскольку координаты точки - действительные числа, а в консоли мы можем отобразить только целые, отрисовка приблизительна.
Вот пример использования класса:
Код:
int main()
{
Pixel p;
p.Print ();
getch();
p.SetColor (red);
p.SetCoordinates (1, 1);
p.Rotate (90);
p.Print();
return 0;
}

Кстати, обратите внимание, поскольку на экране ось Y возрастает сверху вниз, а не снизу вверх, для сдвига по ней надо вычитать координату из координаты центра, а не наоборот.
Сам код класса в приложении. Проверено в VS 2005.
Удачи!

Приложение:
//Binary.h
#pragma once
#include "windows.h"
#include <iostream>
using namespace std;

enum Colors { //допустимые цвета (можно расширить при желании)
red = FOREGROUND_RED,
blue = FOREGROUND_BLUE,
green = FOREGROUND_GREEN,
white = FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN
};

class Pixel
{
char symbol; //символ отображения
double x; //координаты
double y;
Colors color; //цвет

static const int wigth = 80; //ширина и высота консоли
static const int height = 25;
static const int centerx = 40; //координаты центра
static const int centery = 12;
public:
Pixel ():x(0), y(0), color(white), symbol('.') {}; //конструктор по умолчанию
Pixel (double x_, double y_):x(x_), y(y_), color(white), symbol('.') {}; //конструктор с координатами
void SetColor (Colors col); //установка цвета
void SetCoordinates (double x_, double y_); //установка координат
void Print (); //печать
bool IsVisible (); //проверка видимости
void Rotate (double angle); //поворот на заданный угол в градусах
double X (); //получение координат
double Y ();
};

//source file
#include "Binary.h"
#include <math.h>


void Pixel::SetColor (Colors col)
{
color = col;
}

void Pixel::SetCoordinates (double x_, double y_)
{
x = x_;
y = y_;
}

void Pixel::Print ()
{
system ("cls"); //очистка экрана
if (!IsVisible()) {cout << "Out of view"; return;} //проверка видимости
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //получаем указатель на окно консоли
SetConsoleTextAttribute(handle, color); //устанавливаем текущий цвет
for (int i=0; i<centery-y; i++) cout << endl; //сдвигаемся по y (вычитаем!)
for (int i=0; i<centerx+x; i++) cout << ' '; //сдвигаемся по x
cout << symbol << '(' << x << ',' << y << ')'; //печатаем точку и её координаты
}

bool Pixel::IsVisible ()
{
if (centerx+x>wigth || centerx+x<0 || centery-y>height || centery-y<0) return false;
else return true; //проверяем, влезает ли в окно
}

void Pixel::Rotate (double angle)
{
double pi = 3.1415926535; //пи
double B = angle*pi/180; //переводим в радианы
double A = ((180-angle)/2)*pi/180; //получаем два других угла (они равны)
double a = sqrt (pow (abs(x),2)+pow(abs(y),2)); //вычисляем длину отрезка от 0
if (a==0) return; //если длина = 0, точка в начале координат, её бесполезно вращать
double b = a*sin(B)/sin(A); //длина другой стороны (отрезок между старой и новой точкой)
double fi = acos (-x/a); //угол между отрезком от 0 до точки и осью Х
x = x + b*cos(fi+A); //вычисляем координаты
y = y + b*sin(fi+A);
}

double Pixel::X ()
{
return x;
}

double Pixel::Y ()
{
return y;
}
Форма ответа