- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
#include <iostream>
using namespace std;
void Brezenhem(char **z, int x0, int y0, int x1, int y1)
{
int A, B, sign;
A = y1 - y0;
B = x0 - x1;
if (abs(A) > abs(B)) sign = 1;
else sign = -1;
int signa, signb;
if (A < 0) signa = -1;
else signa = 1;
if (B < 0) signb = -1;
else signb = 1;
int f = 0;
z[y0][x0] = '*';
int x = x0, y = y0;
if (sign == -1)
{
do {
f += A*signa;
if (f > 0)
{
f -= B*signb;
y += signa;
}
x -= signb;
z[y][x] = '*';
} while (x != x1 || y != y1);
}
else
{
do {
f += B*signb;
if (f > 0) {
f -= A*signa;
x -= signb;
}
y += signa;
z[y][x] = '*';
} while (x != x1 || y != y1);
}
}
int main()
{
const int SIZE = 25; // размер поля
int x1, x2, y1, y2;
char **z;
z = new char*[SIZE];
for (int i = 0; i < SIZE; i++)
{
z[i] = new char[SIZE];
for (int j = 0; j < SIZE; j++)
z[i][j] = '-';
}
cout << "x1 = "; cin >> x1;
cout << "y1 = "; cin >> y1;
cout << "x2 = "; cin >> x2;
cout << "y2 = "; cin >> y2;
Brezenhem(z, x1, y1, x2, y2);
for (int i = 0; i < SIZE; i++)
{
for (int j = 0; j < SIZE; j++)
cout << z[i][j];
cout << endl;
}
cin.get(); cin.get();
return 0;
}
Запостил: digitalEugene
А идея алгоритма вроде норм освоена.
И вообще, лучше этот код переписать на «Nim».
Ты заранее статически знаешь размер, и он равен 25. Даже если ты пишешь по 8086, тебе хватит стека.
бо нехуй студентам давать кресты
Алгоритмы надо учить на чистой сишке.
Поздравляю, digitalEugene!
Привет, сестрёнка!
Ня! (─‿‿─)
https://ideone.com/Ndovg3
Кодстайл соблядён.
> void Brezenhem(int size, char z[][size], int x0, int y0, int x1, int y1)
Именно поэтому я за "Си"
Я вспомнил «Бейсик» на «Агате», в котором не было оператора CIRCLE, и окружность приходилось реализовывать самому. А синус эта гадость вычисляла невыносимо медленно, поэтому итерироваться по углу было нельзя.
Ну представь как вычислять разложение в ряд (!) когда у тебя нету фпу (!), нету умножения (!) и даже складывать мантиссу приходится восьмибитными кусочками (!).
Я помню у меня калькулятор тоже задумывался над синусами.
CORDIC или как там его.
Умножение и деление даже целых питухов разработчикам Бейсика пришлось пилить самостоятельно.
А реализация плавающего — целое искусство.
Регистры:
A — аккумулятор, 8 бит;
X, Y — индексные регистры, 8 бит;
PC — счетчик команд, 16 бит;
S — указатель стека, 8 бит;
P — регистр состояния;
Пи здесь.
Машинные регистры обычно четырёхбитные. Но их не видно даже на программируемых микрокалькуляторах. Их от пользователя скрывает микрокод.
Аккумулятор X (который прибит к экрану) и «стековые регистры» — это, по всей вероятности, массивы из четырёхбитовых ячеек. То есть микрокод собирает из массива ячеек «макрорегистр».
Числа обычно представлены как BCD. Одна четырёхбитовая ячейка — одна десятичная цифра. То есть на 8-разрядном микрокалькуляторе один «макрорегистр» состоит из восьми четырёхбитовых ячеек под мантиссу + несколько ячеек для хранения порядка и знака. При выводе на экран конвертировать число не нужно, представление уже готово. Ну почти готово. Нужно проверить порядок, если он небольшой, то вывести только мантиссу с нужным положением запятой, а если порядок огромный, то поставить запятую после первого знака мантиссы и вывести порядок.
Погуглил...
«Одно число с 8-разрядной мантиссой и 2-х разрядным порядком занимает 14 тетрад»
Всё ещё интереснее:
https://m.vk.com/@thntofff-vnedrenie-v-arhitekturu-sovetskih-programmiruemyh-kalkulyato
Четырёхбитовые ячейки являются частью гигантского регистра.
У некоторых микрокалькуляторов тригонометрию вычисляет отдельный сопроцессор, сидящий на той же шине, с собственным микрокодом.
Для восьмиразрядного калькулятора хватит четырёх слагаемых формулы Тейлора. Пятое слагаемое уже выйдет за пределы разрядности.
Возможно, реализации каких-то частных случаев я уже видел...
Для этой задачи синус нахуй не нужен
https://wandbox.org/permlink/41wG3PdPotIwauSt
Ну и да, можно по формуле y = sqrt((a-x)^2+(b-y)^2) найти кучу точек, и их соединить отрезками через брезенхейм
Про обход по двум координатам не думал. Интересно. Квадрат считается быстрее корня. Хотя на больших размерах уже наверное будет не очень быстро.
Ещё есть вариант через дифференциальные уравнения:
(x - a)dx + (y - b)dy = 0. Но тут будут накапливаться погрешности и результат может оказаться заметно неровным.
Для заполенного круга они не нужны.
А для незаполненного там тоже есть итеративный алгоритм без корней.
https://wandbox.org/permlink/gxZwbszixkUAiBJF вот так
Смотря как он реализован. Если у тебя процессор без инструкций умножения, и если квадрат и корень реализован тупой таблицей поиска, считаться они будут одинаково по времени. Хотя корень может даже быстрее считаться, учитывая что под квадрат надо в два раза больше бит под результат
А если специальной таблицы поиска для квадратных корней нет, но есть таблица поиска для квадратов, для нахождения квадратного корня можно по ней ебнуть двоичным поиском, это конечно будет медленней
>> под квадрат надо в два раза больше бит под результат
> А под корень надо в два раза больше строчек в таблице.
Смотря с какой точностью какой интервал. Таблицу квадратов и корней еще можно всякими хитровыебаными методами зожимать. Можно еще воспользоваться формулой sqrt(a*b) = sqrt(a)*sqrt(b) из которой вытекает sqrt(a*2^(2*b)) = (2^b)*sqrt(a)
ну т.е. если надо посчитать квадратный корень из 70, используя инты, но получить сколько-то знаков после запятой, можно посчитать квадратный корень из 70 * pow(2, 2*n), и тогда будет n знаков после запятой
З.Ы. Блин, мы так CORDIC изобретём скоро.
Можно тупее: соединить вертикальными отрезками зеркальные точки:
y1 = b + sqrt(r^2 - (x-a)^2)
и
y2 = b - sqrt(r^2 - (x- a)^2)
Получим залитый круг.
А если нужна окружность, сверху наложить круг чуть поменьше.
Вот если нужно сохранять фон, тогда сложнее. Хотя всё равно брезенхейм не нужен. Просто берём единицу в качестве шага по x.
Да там можно напрямую брезенхеймить. Алгоритм то довольно универсальный, любую f(x, y) = 0 можно обводить если получается быстро вычислить значение f в соседних точках.
хуй знает что можно написать на uses graph;
Поле чудес?
Хотя вроде был реально текстовый режим для игры по ssh.
Правда не на 486-м, но мне кажется и на нём бы не тормозило.
Шутер от первого лица а ля Дум, где нужно весь кадр перерисовывать, на uses graph не сделаешь, а вот игры с неподвижным фоном — вполне.
https://youtu.be/ZcbJEhE8dFY
Елена Вставская (Константинова), 1978-го года издания, Челябинск, доцент ЮУрГУ, замужем?
https://sun9-29.userapi.com/sun9-17/IkiB_1wb_xMyPNzfuEYErf0svk_Y9JhT_e3n1Q/2ajObcm_i5g.jpg
Ну с другой стороны, они уже замужем, ей уже всё равно.
Считается, что крупные свиньи при сбалансированном питании и комфортной жизни запросто проживут порядка 35 лет.
https://sun9-29.userapi.com/sun9-85/sN3BcKYVeadxDN7_oF6W4EWHBzP3PcvMdkomHg/6iAGqG6-PHE.jpg
Но в целом вызывает ощущение типичного программиста.
Современный типичный программист имеет синие волосы, зеленую тату, оранжевые шорты, и макбук со смузи
Спасибо, Елена, за понятное объяснение и элегантный код, очень всё упаковано, а ведь есть 8 вариантов знаков и отношений модулей A и B.
и это явно не троллинг. судя по всему это те самые программисты по блок-схемам.
я думал гост
https://govnokod.ru/27605#comment660997