Решение лабораторных, контрольных и т.д. на С++

  • Автор темы European
  • Дата начала
Статус
Закрыто для дальнейших ответов.
W

Wolverine

Приветсвую. Подскажите, как решить проблему с функцией floodfill. Примитивный пример: нарисовать черный круг на белом фоне
Код:
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
main()
{
clrscr();
int gdriver=DETECT, gmode;
initgraph(&gdriver, &gmode, "");
setlinestyle(0,1,1);
circle(320,240,30);
setfillstyle(1,15);
floodfill(2,2,2);
getch();
}
Почему-то закрашивается весь экран( Где ошибка?
 
W

Wolverine

Благодарю.
С floodfill(2,2,255) все работает (также как и с floodfill(2, 2, getmaxcolor()) ).

а ошибка в том что надо почитать про параметры floodfill
В справочнике написано
Синтаксис: void far floodfill(int x, int y, int border);

Описание: floodfill заполняет ограниченную область на
устройствах с побитовым отображением. (x,y) -
произвольная точка внутри закрашиваемой области.
Область, граница которой окрашена цветом
border
,заполняется текущим цветом закраски и
шаблоном. Если указанная точка находится внутри
ограниченной области,то окрашивается область, а
если снаружи, то закрашивается все поле за
пределами области.
Т.е. по идее я могу выбрать любой цвет границы, но на деле он может быть только белый. Поясните, пожалуйста этот момент.
 
W

Wolverine

Народ, помогите еще с задачей:
На экране дан раскрашенный правильный треугольник (координаты известны). Каким образом можно его симметрично отразить от одной из сторон?
Вобщем, помогите придумать конструкцию с getpixel и putpixel, у меня че то не не получается(
 
W

Wolverine

Нет, там сложный рисунок (в треугольнике).
 
W

Wolverine

rrrFer
Вообщем я сделал нечто подобное, появилась другая проблема: отраженное изображение в черных точках, т.е. как бы незаполненых пикселах.
Ради интереса уменьшил шаг итераций при переборе точек в треугольнике (сделал его <1) - черные пиксели исчезли, но само отраженное изображение стало чуть искаженным(
Где искать проблему?
 
W

Wolverine

Кстати, даже с шагом 1 зарисовка идет очень медленно, едва ли ни целую секунду. Хотелось бы, чтобы оно все не было заметно глазом, т.е. чтобы картинка "появлялась" сразу. Можно такое сделать как-то? Работаю в борланд си++ для доса, версия 3.1...
 
W

Wolverine

rrrFer
Не, только те, что в треугольнике.
 
W

Wolverine

Вот вариант, о котором я говорил:
Код:
for(yg=y1+1;yg<y2;yg=yg+1)	 //у2 -координата по у нижних вершин треугольника, если считать одно из оснований параллельным горизонтальной оси
{
for(xg=x-(yg-y1)/sqrt(3)+1;xg<(x+(yg-y1)/sqrt(3)-1);xg=xg+1 )	// х2 - то же самое по х
{
putpixel( xg+(x+(yg-y1)/sqrt(3)-xg )*sqrt(3)/2*sqrt(3), yg-(x+(yg-y1)/sqrt(3)-xg )*sqrt(3)/2,getpixel(xg,yg) );  x - точка пересечения медиан/биссекстри/высот.
}
}

Вот есть еще вариант с использованием теории векторов, он мне нравится больше, но проблема в нем та же самая, разве что черные точки расположены неравномерно.
Код:
float func(float xo1, float yo1,float xo2, float yo2, float xo3, float yo3)	//xo1,xo2,xo3,yo1,yo2,yo3 - координаты треугольника, причем xo3,yo3
координаты точки, лежащей против стороны отражения{
float x,y,u,v,t,x4,y4,shag=1/r;
for (u=0; u<=1;u=u+shag)
{
for (v=0;v<=1-u;v=v+shag)
{
x=x1+u*(x2-x1)+v*(x3-x1);	 //перебираем все по х
y=y1+u*(y2-y1)+v*(y3-y1);	 //перебираем все по у
t=((x2-x1)*(x-x1)+(y2-y1)*(y-y1))/((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); //этот коэффициент долго выводится, но суть его в следующих строкчках =)
x4=x1+2*t*(x2-x1)-(x-x1);	  //перебираем координаты по х отраженной точки 
y4=y1+2*t*(y2-y1)-(y-y1);	  //перебираем координаты по y отраженной точки
putpixel(x4,y4,getpixel(x,y));
}
}return 0;
}
Я так подозреваю, что вопрос как-то связан с типом переменных, может там округляется что-то не так...
 
W

Wolverine

Спасибо)
Но вот, наверное, самый глупый вопрос здесь: что означают знаки вопроса и двоеточия вот тут:
Код:
return (By==Ay)? 1: (x>=(Bx-Ax)*(y-Ay)/(By-Ay)+Ax);
и тут
Код:
txmax=Ax>Bx?Ax>Cx?Ax:Bx>Cx?Bx:Cx:Bx>Cx?Bx:Cx;
?

Кстати, задача стояла отразить треугольник...
 
W

Wolverine

Код:
для этого заменить надо putpixel(x+txmax,y,getpixel(x,y));
Вот в этом-то и вся трудность.

В тех вариантах, которые я выложил выше, проблема возникает как раз на этапе высчитывания координат отраженной точки. Т.е., если я заменю
Код:
putpixel( xg+(x+(yg-y1)/sqrt(3)-xg )*sqrt(3)/2*sqrt(3), yg-(x+(yg-y1)/sqrt(3)-xg )*sqrt(3)/2,getpixel(xg,yg) )
на
Код:
putpixel( xg+300, yg,getpixel(xg,yg) )
,
то пропущеннык точек не получится.
 
K

kataklysm

Доброе время суток. Помогите пожалуйста решить:
1.Создать файл, содержащий сведения о том, какие из пяти предложенных дисциплин желают слушать студенты. Структура записи: фамилия студента, номер группы, средний бал, пять дисциплин, где * показывает выбранную дисциплину. Создать файл, содержащий данные о том, кто желает прослушать дисциплину ХХ. Если желающих больше десяти, то отобрать тех студентов, у которых более высокий средний бал.

2. В матрице удалить столбцы с максимальным и минимальны элементами матрицы, а затем на место первого добавить столбец из произведений элементов соответствующих строк.
 
T

Tanushka

помогите найти ошибку.Задача звучит так Группы символов,разделенные пробелами(один или нескольками)и не содержащие пробелов внутри себя,будем называть словами.Подсчитать кол-во слов в данный последовательности.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
void main()
{
clrscr();
char s[30];
printf("Vvedite stroky teksta:");
gets(s);
int k,i,n;
n=strlen(s);
for (i=1;i<n;i++)
{
if (s[i-1]==' ' && s!=' ')
k++;
}
printf("Chislo slov v tekste = %i",k);
getch();
}
 
D

dimona

Привет. Есть те кто дружит с ООП и конструкторами? Если да, то помогите разобраться:
Пример таков:
Дано Ф.И.О. возраст пол
Иванов И.И. 45 муж
Петров П.П. 30 муж
и т.д.
Как через класс, конструктор и т.д. считать данные из файла и записать в другой. У меня получилось (почти), но считывает только первую фамилию, а далее всякая ерунда ввиде цифр :( Помогите. zanzar-19@yandex.ru :)
 
E

European

Уважаемые форумчане! На нашем форуме создан отдельный форум для решения задач на С и С++: https://codeby.net/forums/c-c-c.52/

Эта тема себя исчерпала!
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!