Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 3

Кох и его снежинка

29.06.2016, 19:32. Показов 3424. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня. Начал изучать C#, и все шло замечательно, пока не столкнулся с проблемой.
Голову сломал, но не могу понять, где ошибка, возможно что даже в моей ДНК
Упростил код, но сохранил структуру, типы и прочее, так как результат не поменялся.
Помогите пожалуйста и тыкните носом неразумного.
На ваш суд:
C#
1
2
3
4
5
6
7
8
9
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
class Program
    {
        static void Main(string[] args)
        {
            double[][] koch = new double[5][];
            //Starting position
            koch[0] = new double[2] { 250, 300 };
            koch[4] = new double[2] { 500, 300 };
            /*************************************/
            koch[1] = new double[2];
            koch[2] = new double[2];
            koch[3] = new double[2];
            /*************************************/
            //формула нахождения координат на отрезке
            //x = (x1+lamb*x2)/ (1 + lamb),  y = (y1+lamb*y2)/ (1 + lamb)
            koch[1][0]= (koch[0][0] + 1 / 2 * koch[4][0]) / (1 + 1 / 2); 
            koch[1][1]= (koch[0][1] + 1 / 2 * koch[4][1]) / (1 + 1 / 2); 
            koch[3][0]= (koch[0][0] + 2 * koch[4][0]) / (1 + 2);
            koch[3][1]= (koch[0][0] + 2 * koch[4][0]) / (1 + 2);
            /************************************/
            //Формула нахождения вершины равностороннего треугольника
            //x3 = (x2 - x1) * cos(60) - (y2 - y1) * sin(60) + x1
            //y3 = (x2 - x1) * sin(60) + (y2 - y1) * cos(60) + y1
 
            koch[2][0]= (koch[3][0] - koch[1][0]) * System.Math.Cos(60) - (koch[3][1] - koch[1][1]) * System.Math.Sin(60) + koch[1][0]; 
            koch[2][1]= (koch[3][0] - koch[1][0]) * System.Math.Cos(60) - (koch[3][1] - koch[1][1]) * System.Math.Sin(60) + koch[1][0];
            GraphicsWindow.Show();
            for (int i2 = 0; i2 < koch.Length - 1; i2++)
            {
                GraphicsWindow.DrawLine(koch[i2][0], koch[i2][1], koch[i2 + 1][0], koch[i2 + 1][1]);
            }
            Console.ReadKey();
 
 
        }
Тут представлен код всего одного сегмента, который даже вместо него рисует убожество.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.06.2016, 19:32
Ответы с готовыми решениями:

Построение кривой Кох
Построение кривой Кох с использованием аффинных преобразований производится следующим образом: каждый элемент кривой содержит четыре звена,...

Снежинка
Дано нечетное число nn. Создайте двумерный массив из n×nn×n элементов, заполнив его символами «.». Затем заполните символами «*» среднюю...

Снежинка
помогите плиз((( мне в курсовике есть задание нарисовать снежинку в Pascalе... а я не знаю как это делать((( не могли бы вы прислать...

7
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
29.06.2016, 19:35
fexzet, я рекурсией ее рисовал =)
+ не все знают о какой библиотеке идет речь.
0
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 3
29.06.2016, 19:52  [ТС]
Да с рекурсией проблем нет. Более того, она есть в основном коде, который рисует целую снежинку, где и фрактальность поменять можно и прочее, ну то есть должна рисовать .
Но я дошел до массивов и вот получилась беда. Рисовать рисует, но ужас вместо снега.
А библиотека служит только для графического окна и непосредственно рисования линий от точки к точке.
Microsoft.SmallBasic.Library
Что знаю то и использую.

Добавлено через 12 минут
Извиняюсь, но копирование кода в сообщение форума работало некорректно, потому пришлось копировать частами и переписывать руками, была допущена ошибка. Так выглядит неработающий код на самом деле
C#
1
2
3
4
5
6
7
8
9
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
class Program
    {
        static void Main(string[] args)
        {
            double[][] koch = new double[5][];
            //Starting position
            koch[0] = new double[2] { 250, 300 };
            koch[4] = new double[2] { 500, 300 };
            /*************************************/
            koch[1] = new double[2];
            koch[2] = new double[2];
            koch[3] = new double[2];
            /*************************************/
            //формула нахождения координат на отрезке
            //x = (x1+lamb*x2)/ (1 + lamb),  y = (y1+lamb*y2)/ (1 + lamb)
            koch[1][0]= (koch[0][0] + 1 / 2 * koch[4][0]) / (1 + 1 / 2); 
            koch[1][1]= (koch[0][1] + 1 / 2 * koch[4][1]) / (1 + 1 / 2); 
            koch[3][0]= (koch[0][0] + 2 * koch[4][0]) / (1 + 2);
            koch[3][1]= (koch[0][1] + 2 * koch[4][1]) / (1 + 2);
            /************************************/
            //Формула нахождения вершины равностороннего треугольника
            //x3 = (x2 - x1) * cos(60) - (y2 - y1) * sin(60) + x1
            //y3 = (x2 - x1) * sin(60) + (y2 - y1) * cos(60) + y1
 
            koch[2][0]= (koch[3][0] - koch[1][0]) * System.Math.Cos(60) - (koch[3][1] - koch[1][1]) * System.Math.Sin(60) + koch[1][0]; 
            koch[2][1]= (koch[3][0] - koch[1][0]) * System.Math.Sin(60) - (koch[3][1] - koch[1][1]) * System.Math.Cos(60) + koch[1][0];
            GraphicsWindow.Show();
            for (int i2 = 0; i2 < koch.Length - 1; i2++)
            {
                GraphicsWindow.DrawLine(koch[i2][0], koch[i2][1], koch[i2 + 1][0], koch[i2 + 1][1]);
            }
            Console.ReadKey();
 
 
        }
Правка доступная в течении 5 минут к сожалению кончилась.
0
 Аватар для taksebe
22 / 22 / 3
Регистрация: 11.12.2013
Сообщений: 122
29.06.2016, 21:45
Лучший ответ Сообщение было отмечено fexzet как решение

Решение

Во-первых, вы не правильно считаете. Функции COS и SIN принимают данные в виде радианов, а не градусов.
Во-вторых, когда вы высчитываете koch[2][1] в самом конце неверный индекс(см. код).
В-третьих зачем вам 5 точек для 4 линий, если вы рисуете треугольник с тремя сторонами.

C#
1
2
3
4
5
koch[2][1] = (koch[3][0] - koch[1][0]) * System.Math.Sin(60) - (koch[3][1] - koch[1][1]) 
                * System.Math.Cos(60) + koch[1][0];
=>
koch[2][1] = (koch[3][0] - koch[1][0]) * System.Math.Sin(60) - (koch[3][1] - koch[1][1]) 
                * System.Math.Cos(60) + koch[1][1];
В-четвертых вот тут разные коэффициенты:
C#
1
2
3
4
5
6
            //формула нахождения координат на отрезке
            //x = (x1+lamb*x2)/ (1 + lamb),  y = (y1+lamb*y2)/ (1 + lamb)
            koch[1][0] = (koch[0][0] + 1d / 2d * koch[4][0]) / (1d + 1d / 2d);
            koch[1][1] = (koch[0][1] + 1d / 2d * koch[4][1]) / (1d + 1d / 2d);
            koch[3][0] = (koch[0][0] + 2d * koch[4][0]) / (1d + 2d);
            koch[3][1] = (koch[0][1] + 2d * koch[4][1]) / (1d + 2d);
ЗЫ. буква d - означает, что число приводится к типу double.
1
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
29.06.2016, 21:51
Лучший ответ Сообщение было отмечено fexzet как решение

Решение

еще там ошибка с преобразованием типов (1 + 1/2 = 1)
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
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
double[][] koch = new double[5][];
//Starting position
koch[0] = new double[2] { 250, 300 };
koch[4] = new double[2] { 500, 200 }; // тут я повернул немного для проверки
/*************************************/
koch[1] = new double[2];
koch[2] = new double[2];
koch[3] = new double[2];
/*************************************/
//формула нахождения координат на отрезке
//x = (x1+lamb*x2)/ (1 + lamb),  y = (y1+lamb*y2)/ (1 + lamb)
koch[1][0] = (koch[0][0] + 1.0 / 2.0 * koch[4][0]) / (1.0 + 1.0 / 2.0);
koch[1][1] = (koch[0][1] + 1.0 / 2.0 * koch[4][1]) / (1.0 + 1.0 / 2.0);
koch[3][0] = (koch[0][0] + 2.0 / 1.0 * koch[4][0]) / (1.0 + 2.0 / 1.0);
koch[3][1] = (koch[0][1] + 2.0 / 1.0 * koch[4][1]) / (1.0 + 2.0 / 1.0);
/************************************/
//Формула нахождения вершины равностороннего треугольника
//x3 = (x2 - x1) * cos(60) - (y2 - y1) * sin(60) + x1
//y3 = (x2 - x1) * sin(60) + (y2 - y1) * cos(60) + y1
 
double Angle = 60.0 * System.Math.PI / 180.0;
koch[2][0] = (koch[3][0] - koch[1][0]) * System.Math.Cos(Angle) - (koch[3][1] - koch[1][1]) * System.Math.Sin(Angle) + koch[1][0];
koch[2][1] = (koch[3][0] - koch[1][0]) * System.Math.Sin(Angle) + (koch[3][1] - koch[1][1]) * System.Math.Cos(Angle) + koch[1][1];
GraphicsWindow.Show();
GraphicsWindow.PenColor = "red";
GraphicsWindow.DrawLine(koch[0][0], koch[0][1], koch[1][0], koch[1][1]);
GraphicsWindow.PenColor = "green";
GraphicsWindow.DrawLine(koch[1][0], koch[1][1], koch[2][0], koch[2][1]);
GraphicsWindow.PenColor = "blue";
GraphicsWindow.DrawLine(koch[2][0], koch[2][1], koch[3][0], koch[3][1]);
GraphicsWindow.PenColor = "black";
GraphicsWindow.DrawLine(koch[3][0], koch[3][1], koch[4][0], koch[4][1]);
            
/*
for (int i2 = 0; i2 < koch.Length - 1; i2++)
{
    GraphicsWindow.DrawLine(koch[i2][0], koch[i2][1], koch[i2 + 1][0], koch[i2 + 1][1]);
}*/
Console.ReadKey();


Добавлено через 2 минуты
Цитата Сообщение от taksebe Посмотреть сообщение
-третьих зачем вам 5 точек для 4 линий, если вы рисуете треугольник с тремя сторонами.
В cмысле?
1
 Аватар для taksebe
22 / 22 / 3
Регистрация: 11.12.2013
Сообщений: 122
29.06.2016, 22:34
Цитата Сообщение от Aael Посмотреть сообщение
Добавлено через 2 минуты
Сообщение от taksebe
-третьих зачем вам 5 точек для 4 линий, если вы рисуете треугольник с тремя сторонами.
В cмысле?
не всем понятно, что ТС хочет от кода.
1
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
29.06.2016, 23:20
taksebe, я понял тебя, там не треугольник рисуется а кривая из 4х линий:
C#
1
2
3
      C
     / \
A---B   D---E
Координаты точек A и E известны, а B, C и D вычисляются, так чтобы AB=BC=CD=DE=BD
1
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 3
30.06.2016, 21:26  [ТС]
Aael, taksebe, Большое спасибо, исключая мою невнимательность к типам, ошибка была в незнании работы Math.Sin/Cos.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.06.2016, 21:26
Помогаю со студенческими работами здесь

Снежинка
Всем привет!Нужно сделать задачу Снежинка. Условие по ссылке внизу (Ссылка на сторонний ресурс удалена) Желательно написать на Python...

Снежинка Коха
Привет Всем ! В общем, у меня есть программа, которая рисует кривую Коха........Мне нужно построить снежинку Коха......там в принципе тоже...

Судоку снежинка
Ребята, может кто писал или знает как писать программу этой головоломки, помогите)

снежинка коха
Нужно в Mathematica сделать снежинку коха. Получилось только это: points = {{1.0, 0.0}}; koch := Join.#/3 + {1/3, 0}) &amp;...

Снежинка коха
В универе задали лабу. задание следующее: &quot;построение снежинки коха&quot;. Дело в том, что пошаговое объяснение есть, но писал его видимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru