Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Elloriane
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 61
1

Не могу придумать условие (ограничение) на построение

26.02.2012, 17:00. Просмотров 543. Ответов 0
Метки нет (Все метки)

Здравствуйте, пишу программку в Си
Фрактальные кривые, а именно кривая Леви
http://elementy.ru/posters/fractals/Levy

Вроде бы все ничего, но уже замучался - при построении 4 итерации (сравните с сайтом) программка не в ту сторону "ломает" прямую. Я понял, какое нужно условие : при попадении на прямую, -2 итерации, нужно поменять знак, но как ничего не пробовал - ничего не помогет (т.е. проблема во мне (
знак в этой строчке :
C
1
px[i+k/2]=(px[i+k]+px[i])/2+(d/2)*sin(fi);py[i+k/2]=(py[i+k]+py[i])/2-(d/2)*cos(fi);
перед тригонометрическими функциями

сначала задаем 2 точки, потом стрелками (влево и вправо) меняем итерацию

сама функция построения
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void draw (int k, int kmem) //n-число точек, nn- кол-во итераций
{   int i,j;
    double d,fi,pi=3.141529,ox,oy,r,t;
while (k>1)
{
    for (i=0;i<kmem;i=i+k)
    {
        d=sqrt((px[i]-px[i+k])*(px[i]-px[i+k])+(py[i]-py[i+k])*(py[i]-py[i+k]));
        fi=atan((py[i]-py[i+k])/(px[i]-px[i+k]));
        px[i+k/2]=(px[i+k]+px[i])/2+(d/2)*sin(fi);py[i+k/2]=(py[i+k]+py[i])/2-(d/2)*cos(fi);
    }
    k=k/2;
    draw(k,kmem);
}
    for (i=0;i<kmem;i++)    
        line((int)px[i],(int)py[i],(int)px[i+1],(int)py[i+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
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "graphics.h"
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
 
double * px=NULL, * py=NULL;
void cursor(int color, int ox, int oy)
{
    setlinestyle(2, 1, 1);
    setcolor(color);
    line (ox,oy,ox-6,oy);
    line (ox-6,oy,ox-4,oy-2);
    line (ox-4,oy-2,ox-6,oy-4);
    line (ox-6,oy-4,ox-4,oy-6);
    line (ox-4,oy-6,ox-2,oy-4);
    line (ox-2,oy-4,ox,oy-6);
    line (ox,oy-6,ox,oy);
}
 
void draw (int k, int kmem) //n-число точек, nn- кол-во итераций
{   int i,j;
    double d,fi,pi=3.141529,ox,oy,r,t;
while (k>1)
{
    for (i=0;i<kmem;i=i+k)
    {
        d=sqrt((px[i]-px[i+k])*(px[i]-px[i+k])+(py[i]-py[i+k])*(py[i]-py[i+k]));
        fi=atan((py[i]-py[i+k])/(px[i]-px[i+k]));
        px[i+k/2]=(px[i+k]+px[i])/2+(d/2)*sin(fi);py[i+k/2]=(py[i+k]+py[i])/2-(d/2)*cos(fi);
    }
    k=k/2;
    draw(k,kmem);
}
    for (i=0;i<kmem;i++)    
        line((int)px[i],(int)py[i],(int)px[i+1],(int)py[i+1]);
}
int main(void)
{
  int gd = DETECT, gm;
  int maxx, maxy, k=1, k1=1, k2=1, k3=1, t=1,z=1,ox,oy,x1=-1,y1=-1,x2=-1,y2=-1;
  initgraph(&gd, &gm, "");
  maxx = getmaxx();
  maxy = getmaxy();
  ox=maxx/2;oy=maxy/2;
  cursor(15,(int)ox,(int)oy);
  while ((x1==-1)||(x2==-1))
  {
      if (anykeypressed())
      {t=readkey();
      if (t==119) //w
      {
          cursor(0,ox,oy);oy=oy-3;cursor(15,ox,oy);
      }
      if (t==97) //a
      {
          cursor(0,ox,oy);ox=ox-3;cursor(15,ox,oy);
      }
      if (t==115) //s
      {
          cursor(0,ox,oy);oy=oy+3;cursor(15,ox,oy);
      }
      if (t==100) //d
      {
          cursor(0,ox,oy);ox=ox+3;cursor(15,ox,oy);
      }
      if (t==32)  //space
      {
          if (z==1) {x1=ox;y1=oy;circle(x1,y1,5);}
          if (z==2) {x2=ox;y2=oy;z=1;cursor(0,ox,oy);setcolor(15);circle(x2,y2,5);}
          z++;
      }
      }
  }
  circle(x1,y1,5);circle(x2,y2,5);
  setlinestyle(2, 3, 3);
  while(k2>=0)
  {
      k3=k2;k1=k;
      while(k3>0) {k1=k1*2;k3--;}
      px=malloc(sizeof(double)*(k1));
      py=malloc(sizeof(double)*(k1));
      px[0]=x1;px[k1]=x2;py[0]=y1;py[k1]=y2;
      draw(k1,k1);
      if (anykeypressed())
      {
          t=readkey();
          if (t==75) {setcolor(0);draw(k1,k1);setcolor(15);k2--;}
          if (t==77) {setcolor(0);draw(k1,k1);setcolor(15);k2++;}
      }
  }
  closegraph();
  return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2012, 17:00
Ответы с готовыми решениями:

Ниче не приходит в голову, не могу придумать код
Задан целочисленный массив размера N. Удалить из массива все элементы встречающиеся более двух раз....

Придумать условие
выводит числа двоичная запись которых представляет собой симметричную последовательность нулей и...

Не могу придумать решение
Помогите сделать программу:&quot;Дан массив из целых чисел. Упорядочить эти числа по знаку: сначала...

Алгоритм. Не могу придумать.
Задача такая: Имеется, грубо говоря, 256-битовый порт. Имеется несколько многобитных (от 1 до 16)...

Не могу придумать алгоритм
В общем у меня есть переменные left = 'n'; top = 'n'; right = 'y'; down = 'y'; и нужно чтоб...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2012, 17:00

Не могу придумать задание
Здравствуйте всем. Преподаватель сказал придумайте и выполнить задание в котором бы содержалось...

Не могу придумать структуру БД
Бд для тестов и опросов. Основная сложность - разные типы вопросов. 3 таблицы думаю точно нужны:...

Не могу придумать интерфейс
Есть форма, в которой нужен ввод информации о человеке: фамилия, имя, отчество, вид, серия и номер...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru