1

Тема: Як запрограмувати "шлях" ?

Хай хай. От нехай у нас є поле.
http://puu.sh/94W7X/2b75ad9b47.png
Червона крапка - початок руху. І от треба якось так запрограмувати, аби воно було і гарно, і лаконічно, і працювало, ну щоб рухалось щось по цій траекторії треба зробити. Як так зробити?

2 Востаннє редагувалося Chemist-i (28.05.2014 19:27:21)

Re: Як запрограмувати "шлях" ?

pseudo
int x=4, y=5;
for (int i=0; i<3; i++){
  x--;
  y--;
  SetPosition();
}

for (int i=0; i<5; i++){
  x++;
  SetPosition();
}

for (int i=0; i<3; i++){
  x--;
  y++;
  SetPosition();
}
Подякували: FakiNyan1

3

Re: Як запрограмувати "шлях" ?

Chemist-i написав:
pseudo
int x=4, y=5;
for (int i=0; i<3; i++){
  x--;
  y--;
  SetPosition();
}

for (int i=0; i<5; i++){
  x++;
  SetPosition();
}

for (int i=0; i<3; i++){
  x--;
  y++;
  SetPosition();
}

А якщо форма буде іншою? Було б непогано, якби був один метод, котрий приймає масив з точок, а потім вже в залежності від кількості цих точок рухається об'єкт, ну ви зрозуміли, ага? Типу універсальний алгоритм

4

Re: Як запрограмувати "шлях" ?

мені здається, всередині має бути рекурсивна функція, котра бере дві точки і створює інтерполяцію між ними, і по отриманим в процесі точкам маємо рухати чувачка

5 Востаннє редагувалося Chemist-i (28.05.2014 20:33:57)

Re: Як запрограмувати "шлях" ?

pseudo2
GetPointArr(*arr);

//may be get of steps count method 
int GetCountOfSteps(x1,y1,x2,y2)
{
    return = sqrt( sqr(x1-x2) + sqr(y1-y2) ); //Pythagoras' theorem
}

//main
for (int j=0; j<Length(*arr)-1; j++)
{
    x1 = getX( arr[j+1] ); //get first point x coordinate
    y1 = getY( arr[j+1] ); //get first point y coordinate
    x2 = getX( arr[j+0] ); //get second point x coordinate
    y2 = getY( arr[j+0] ); //get second point y coordinate    

    countOfSteps = GetCountOfSteps(x1,y1,x2,y2)//get count of interpolation steps
    
    for (int i=0; i<countOfSteps; i++)
    {

        x0; //current position x
        y0; //current position y
        
        x0= (x1 + (i/countOfSteps));
        y0=-(x2*y1+y2*x0-y2*x1-y1*x0)/(x1-x2);
        
        setPosition(x0,y0);
    }
}
some theory

http://cs608818.vk.me/v608818454/b4cf/K1twrORNKQQ.jpg

a/b = c/d  //first law of proportion
Подякували: FakiNyan1

6

Re: Як запрограмувати "шлях" ?

Chemist-i написав:
pseudo2
GetPointArr(*arr);

//may be get of steps count method 
int GetCountOfSteps(x1,y1,x2,y2)
{
    return = sqrt( sqr(x1-x2) + sqr(y1-y2) ); //Pythagoras' theorem
}

//main
for (int j=0; j<Length(*arr)-1; j++)
{
    x1 = getX( arr[j+1] ); //get first point x coordinate
    y1 = getY( arr[j+1] ); //get first point y coordinate
    x2 = getX( arr[j+0] ); //get second point x coordinate
    y2 = getY( arr[j+0] ); //get second point y coordinate    

    countOfSteps = GetCountOfSteps(x1,y1,x2,y2)//get count of interpolation steps
    
    for (int i=0; i<countOfSteps; i++)
    {

        x0; //current position x
        y0; //current position y
        
        x0= (x1 + (i/countOfSteps));
        y0=-(x2*y1+y2*x0-y2*x1-y1*x0)/(x1-x2);
        
        setPosition(x0,y0);
    }
}
some theory

http://cs608818.vk.me/v608818454/b4cf/K1twrORNKQQ.jpg

a/b = c/d  //first law of proportion

ви так пояснюєте, що без шоколадного торта не розібратись. Як бути з нецілими значеннями?
http://puu.sh/957El/edfa4ebf32.png
І поясніть, що це за

y0=-(x2*y1+y2*x0-y2*x1-y1*x0)/(x1-x2)

7 Востаннє редагувалося Chemist-i (28.05.2014 21:09:36)

Re: Як запрограмувати "шлях" ?

FakiNyan написав:

що без шоколадного торта

Висилайте, я мешкаю у Дніпропетровську, з радістю скуштую =)

FakiNyan написав:

Як бути з нецілими значеннями?

Округлювати не пробували?

FakiNyan написав:
y0=-(x2*y1+y2*x0-y2*x1-y1*x0)/(x1-x2)

Розрахунок координати y0

Подякували: FakiNyan1

8

Re: Як запрограмувати "шлях" ?

Chemist-i написав:
FakiNyan написав:

що без шоколадного торта

Висилайте, я мешкаю у Дніпропетровську, з радістю скуштую =)

FakiNyan написав:

Як бути з нецілими значеннями?

Округлювати не пробували?

FakiNyan написав:
y0=-(x2*y1+y2*x0-y2*x1-y1*x0)/(x1-x2)

Розрахунок координати y0

торт мені.
в яку сторону?
чому там мінус? І чому розрахунок цієї координати такий здоровий, а розрахунок x0 маленький?

9

Re: Як запрограмувати "шлях" ?

І поясніть про отримання кількості потрібних кроків для переходу з однієї точки в іншу, на прикладі (3;2) -> (3,6)
http://puu.sh/95auI/a7ce1ebd26.png

10 Востаннє редагувалося Chemist-i (28.05.2014 21:51:06)

Re: Як запрограмувати "шлях" ?

чому там мінус?

бо математика

І чому розрахунок цієї координати такий здоровий

Можете зробити меншим? - будь-ласка

І поясніть про отримання кількості потрібних кроків для переходу з однієї точки в іншу, на прикладі (3;2) -> (3,6)

Бо ви читаєте неуважно, в коментарях написано Теорема Піфагора, sqr != sqrt. Кількість кроків величина умовна, можна хочь 100 написати результат не зміниться, але розрахунків більше (я взяв так бо це приблизно дорівнює кількості клітинок між точками (округляти можна в будь-яку сторону), і є гіпотенузою прямокутного трикутника. корєнь(квадрат(а)+квадрат(б)) = довжина гіпотенузи, катети а, б.
Ви не хочете розбиратись в проблемі, чому я маю за Вас думати?
так, і тортик я від Вас чекаю!

Подякували: FakiNyan1

11

Re: Як запрограмувати "шлях" ?

Chemist-i написав:

чому там мінус?

бо математика

І чому розрахунок цієї координати такий здоровий

Можете зробити меншим? - будь-ласка

І поясніть про отримання кількості потрібних кроків для переходу з однієї точки в іншу, на прикладі (3;2) -> (3,6)

Бо ви читаєте неуважно, в коментарях написано Теорема Піфагора, sqr != sqrt. Кількість кроків величина умовна, можна хочь 100 написати результат не зміниться, але розрахунків більше (я взяв так бо це приблизно дорівнює кількості клітинок між точками (округляти можна в будь-яку сторону), і є гіпотенузою прямокутного трикутника. корєнь(квадрат(а)+квадрат(б)) = довжина гіпотенузи, катети а, б.
Ви не хочете розбиратись в проблемі, чому я маю за Вас думати?
так, і тортик я від Вас чекаю!

так нащо мені гіпотенуза, форма шляху може бути я квадратною і п'ятикутковою, тре рахувати не довжину гіпотинузи, а довжину між точками, в мене немає грошей на торта, як зароблю, то відішлю

12

Re: Як запрограмувати "шлях" ?

гіпотенуза - найкоротша відстать (пряма) між двома сусідніми точками в масиві *arr

Подякували: FakiNyan1

13 Востаннє редагувалося quez (28.05.2014 22:27:15)

Re: Як запрограмувати "шлях" ?

FakiNyan написав:
Chemist-i написав:
pseudo
int x=4, y=5;
for (int i=0; i<3; i++){
  x--;
  y--;
  SetPosition();
}

for (int i=0; i<5; i++){
  x++;
  SetPosition();
}

for (int i=0; i<3; i++){
  x--;
  y++;
  SetPosition();
}

А якщо форма буде іншою? Було б непогано, якби був один метод, котрий приймає масив з точок, а потім вже в залежності від кількості цих точок рухається об'єкт, ну ви зрозуміли, ага? Типу універсальний алгоритм

Якщо масив з точок це весь ваш трикутник, то алгоритм буде тривіальним.
А якщо припустити, що фігура — це багатокутник, то можна передавати лише вершини, а точки рахувати, виходячи з рівняння y = ax + b.

14

Re: Як запрограмувати "шлях" ?

quez написав:
FakiNyan написав:
Chemist-i написав:
pseudo
int x=4, y=5;
for (int i=0; i<3; i++){
  x--;
  y--;
  SetPosition();
}

for (int i=0; i<5; i++){
  x++;
  SetPosition();
}

for (int i=0; i<3; i++){
  x--;
  y++;
  SetPosition();
}

А якщо форма буде іншою? Було б непогано, якби був один метод, котрий приймає масив з точок, а потім вже в залежності від кількості цих точок рухається об'єкт, ну ви зрозуміли, ага? Типу універсальний алгоритм

Якщо масив з точок це весь ваш трикутник, то алгоритм буде тривіальним.
А якщо припустити, що фігура — це багатокутник, то можна передавати лише вершини, а точки рахувати, виходячи з рівняння y = ax + b.

а що тут є що? що а, що b?

15

Re: Як запрограмувати "шлях" ?

Математика непотрібна програмісту.

Прихований текст

Будь-яку пряму можна описати таким рівнянням: для деяких a i b будь-який x дасть відповідний y. a і b можна знайти за допомогою двох відомих точок на прямій.

16

Re: Як запрограмувати "шлях" ?

quez написав:

Математика непотрібна програмісту.

Прихований текст

Будь-яку пряму можна описати таким рівнянням: для деяких a i b будь-який x дасть відповідний y. a і b можна знайти за допомогою двох відомих точок на прямій.

намалюйте мені картинку, щоб легче зрозумілося

17

Re: Як запрограмувати "шлях" ?

Так. Тепер скажіть, що в мене не так?

 private static void Walk(List<double[]> points)
        {
            for (int i = 0; i < points.Count-1; i++)
            {
                double[] start = points.ElementAt(i);
                double[] end = points.ElementAt(i + 1);
                double length = Math.Floor(Math.Sqrt(Math.Pow((start[0] - end[0]), 2) + Math.Pow((start[1] - end[1]), 2)));
                matrix[(int)start[0], (int)start[1]] = 1;
                Console.WriteLine(length);
                for (int j = 0; j < length; j++)
                {
                    double[] temp = new double[] { end[0] - start[0], end[1] - start[1] };
                    start[0] = (start[0] + Math.Floor(temp[0] / length));
                    start[1] = (start[1] + Math.Floor(temp[1] / length));

                    matrix[(int)start[0], (int)start[1]] = 1;
                    
                    length = Math.Floor(Math.Sqrt(Math.Pow((start[0] - end[0]), 2) + Math.Pow((start[1] - end[1]), 2)));
                    Console.WriteLine(start[0]+" start "+start[1]);
                    Console.WriteLine(temp[0] + " temp " + temp[1]);
                    Console.WriteLine("length: "+length);
                }
            }
        }

http://puu.sh/95l7G/573b346776.jpg
Який в мене алгоритм? Та дуже простий, з усього, що ви мені розповідали, я зрозумів лише як дістати довжину між точками, за що і дякую пану Кеміст-Ай'ю, тому я написав так:

  • Маємо точку Старт, та точку Кінець.

  • Дістаємо відстань між точками.

  • Віднімаємо від точки Кінець точку Старт, результат заносимо в точку Тимчасово.

  • Ділимо точку Тимчасово на відстань.

  • Отриману від ділення нову точку додаємо до точки Старт.

  • goto Start;

18

Re: Як запрограмувати "шлях" ?

Пане FakiNyan, уточніть пару деталей:
- фігурка може рухатися тільки по клітинах, дискретно, чи може бути де завгодно?
- шлях заданий тільки кутами маршруту? В цьому випадку - як, на вашу думку, має рухатися фігурка з (0,0) в (3,1) - десь так
0011
1100
чи взагалі рухи дозволені тільки по прямих і діагоналях?

19

Re: Як запрограмувати "шлях" ?

koala написав:

Пане FakiNyan, уточніть пару деталей:
- фігурка може рухатися тільки по клітинах, дискретно, чи може бути де завгодно?
- шлях заданий тільки кутами маршруту? В цьому випадку - як, на вашу думку, має рухатися фігурка з (0,0) в (3,1) - десь так
0011
1100
чи взагалі рухи дозволені тільки по прямих і діагоналях?

1) Тілько по клітинках, навіщо я їх малював, по вашому???
2) Угу, тільки кутами, якщо хочете, то відрізками, тобто якщо в нас є три точки, А, B, C, то ми маємо два відрізка, АВ, та ВС, і спочатку ми рухаємось від точки А до В, а потім від В до С. І прицьому АС може бути теж відрізком прямим, а точка В просто може десь знаходитись на цій прямій, тому не обов'язково ці точки мають бути кутовими. Десь так
http://puu.sh/960Ty/fe24eaa675.png

20

Re: Як запрограмувати "шлях" ?

Дякую.
Тоді ще питання: наскільки важлива швидкість? Тобто "1 зсув за 200мс" - це нормально, чи треба якось витримувати час? Ну, по діагоналі повільніше (бо діагональ довша), чи заборонені стрибки, якщо не встигає за певний час і т.д.?