Member
Статус: Не в сети Регистрация: 01.05.2007 Откуда: Тель-Авив Фото: 1
Provider Тогда извиняюсь. Уж сильно стало похоже на домашнее задание.
Хороший учебник, к сожалению, огласить не могу. Когда-то в детстве читал какую-то книгу, объясняющую синтаксис С чуть ли не в комиксах. За давностью лет автора не помню, но другой столь легкой для понимания литературы с тех пор не встречал.
Да. Так есть вопросы по алгоритму или реализации?
Member
Статус: Не в сети Регистрация: 01.05.2007 Откуда: Тель-Авив Фото: 1
Provider, поехали:
Функция main() принимает 3 аргумента: кол-во аргументов в командной строке, аргументы командной строки, буфер с переменными окружения.
if( argc == 1 ) проверяет, что нам передали параметр. И ругается диезом, если его нам не дали.
Параметр преобразуется в число при помощи sscanf - работает также как и scanf, но берет ввод из строки вместо клавиатуры. Таким образом мы получили диаметр круга.
Если же мы хотим рисовать круг с дефолтовым радиусом если юзер его не ввел - вместо ругани (printf("#"); return 1) можно присвоить нашей переменной значение радиуса по умолчанию.
Алгоритм работы:
простейшая формула круга: x^2 + y^2 = r^2.
предполагается, что центр круга находится в точке (0,0)
Мы идем по квадрату, который начинается в точке (-r, -r) и заканчивается в точке (r, r). Понятно, что наш круг вписан в этот квадрат.
Для каждой точки квадрата мы проверяем, соответствует ли она условию формулы круга. Если да, то рисуем символ. Иначе - пробел.
Поскольку экран начинается в точке (0,0), а нас интересуют отрицательные значения тоже - мы заводим переменные rx и ry. Для упрощения вычислений.
Насчет ошибки компиляции.
После каждого из for надо открыть фигурную скобку.
И заодно вставить перенос строки после каждой отрисованной линии.
Member
Статус: Не в сети Регистрация: 19.12.2005 Откуда: НН Фото: 69
Herod Спасибо за раъяснения!
Herod писал(а):
После каждого из for надо открыть фигурную скобку.
Никогда такого не видел. Зачем это? Впрочем с этими скобками компилятор тоже ругается, мол если есть открывающая, то должна быть и зкрывающая скобка Добавлено спустя 2 минуты, 40 секунд
Herod писал(а):
помощи sscanf - работает также как и scanf
А зачем тут собственно scanf? Нельзя ли использовать argc, как я это делал ранее?
Member
Статус: Не в сети Регистрация: 01.05.2007 Откуда: Тель-Авив Фото: 1
Provider Да, потому что звездочка рисуется только при точном выполнении условия x^2 + y^2 = r^2 По идее, строчку "if((rx*rx+ry*ry)==radius*radius)" можно заменить на "if(abs((rx*rx+ry*ry)-radius*radius) <= 5)" Пятерку подобрать опытным путем. Ну или творить это дело в графике.
ЗЫ. второй способ - считать пару иксов, исходя из той же формулы. То есть, x = sqrt( r^2 - y^2 ). Тогда можно бежать только по y (оставив только внешний цикл), а x вычислять и лепить нужное кол-во пробелов. Не забывая, что у этого уравнения есть два икса с противоположными знаками. Добавлено спустя 8 минут, 18 секунд Код для второго способа:
Код:
#include <stdio.h> #include <math.h>
int main(int argc, char *argv[], char *env[]) { int radius, x, y;
Advanced member
Статус: Не в сети Регистрация: 09.03.2004 Откуда: Кишинёв
Provider писал(а):
Почему он рисуется сплющенным по бокам?
Потому что в текстовом режиме высота символа в два раза превышает его ширину. Нахождение координат (x,y) легко искать из уравнения окружности в [url=http://ru.wikipedia.org/wiki/Полярная_система_координат]полярной системе координат[/url]:
x = Округл(R*2*sin(fi)),
y = Округл(R*cos(fi)).
Двойка при синусе это как раз избавление от сплющивания. Достаточно пробежаться значением fi от 0 до 2Пи(шаг подобрать экспериментально), да не забыть сместить точку центра окружности(например в 40,12). R можно взять к примеру 10.
const int RX = 120; /* разрешение консоли: X */ const int RY = 60; /* разрешение консоли: Y */ const int DX = 60; /* координаты центра круга: X */ const int DY = 30; /* координаты центра круга: Y */ const double R = 25.0; /* радиус */ const double AR = 1.5; /* соотношение высоты символа к ширине */ const double dfi = 0.01; /* шаг угла */
int main() { double fi; int x, y; char buf[RX][RY]; memset(buf, 0, RX * RY);
for( fi = 0.0; fi <= 2 * M_PI; fi += dfi ) { x = DX + round( R * AR * sin(fi) ); y = DY - round( R * 1 * cos(fi) ); buf[x][y] = 1; }
printf("\n"); for( y = 0; y < RY; y++ ) for( x = 0; x < RX; x++ ) buf[x][y] ? printf("*") : printf(" ");
return 0; }
Чтобы корректно работало разрешение консоли должно(!) быть тоже что и в программе. Также нужно следить за радиусом и координатами центра, т.к. проверок лишних нет.
зы: вывод можно было организовать и по другому, но тут главное суть.
Member
Статус: Не в сети Регистрация: 19.12.2005 Откуда: НН Фото: 69
Продолжаю борьбу с кругом... Решел сделать его "круглее", т.е. второй способ Herod, но получается он немного кривоватым. Гляньте, плиз, может ошибки есть или нужно че-нить изменить:
Код:
#include <stdio.h>
int main(int argc, char *argv[], char *env[]) {
int radius, y,s,s0,s1; float x0,x1,x2,x3, rx, ry, d,curvature=1.5;
Member
Статус: Не в сети Регистрация: 15.02.2009 Откуда: Лангепас
Есть класический алгоритм Брезенхема. На его основе сделал алгоритм эллипса. Его достоинство (Брезенхема, а не эллипса) - нет умножений, делений. Одни сдвиги и +-.
Подойдёт и для псевдографики, но нужно или менять видеорежим, или переделывать его в эллипс (высота и ширина символа неодинаковы).
К, сожалению, реализация на ASMе. . Если прочитаеш ASM, могу выслать исходники всей библиотечки. Извини, Это было в далёкие студенческие, а сейчас работоспособный аналог на С/С++ времени нет, да и забыл многое Когда-то, даже математические выкладки были - утеряны...
Вопрос может немного не в тему, но прошу отнестись с пониманием. Начал изучать програмирование в институте:) По программе идет обучение в С.
Из различных источников я понял, что язык довольно старый, но зачОтный. Проникся:)
Единственно, что напрягает писать к пояснения к командам, что я имею ввиду:
If-цикл если
While- выполнять пока
и пр.
Очень лень писать, сразу оговорюсь что многие команды понятны для тех кто знаком с английским, но все таки. Может быть кто-нибудь занимался?
Буду благодарет если кто скинет текстовый файл или ссылочку. Также интересует подобный перечень синтаксических команд для java и С++.
Заранее благодарен:)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения