Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как можно сделать так, чтобы радиус зависел от расстояния? (http://www.flasher.ru/forum/showthread.php?t=206218)

Dip52 20.01.2014 21:13

Как можно сделать так, чтобы радиус зависел от расстояния?
 
Здравствуйте.

Как можно сделать так, чтобы радиус окружности (объект A) зависел от расстояние между объектом A и B и при этом радиус не должен превышать 200 пикселей?

Akopalipsis 20.01.2014 21:40

Прежде нужно измерить само расстояние между А и В и если оно больше if(радиус>200)radius=200;else radius=radius... Вообще вопрос не понятный немного.. Может есть ещё что-то, из-а чего у Вас не получается?) И как он должен зависеть?

Dip52 20.01.2014 21:51

Давайте я лучше напишу, что я хочу сделать.
Я хочу сделать так, чтобы определённое количество звёзд, которые вращаются вокруг точки A, постепенно суживались (приближались к друг другу; радиус уменьшался), достигая точки B. Когда расстояние между двумя точками уже равно 0, то радиус тоже должен быть равен нулю, и в итоге получится, что видно только одну звезду.

Akopalipsis 20.01.2014 22:00

Тогда Вам нужно дистанцию от А до В выразить в качестве процентной шкалы, где полное первоначальное расстояние ровнялось 200 пикселям. И получается, чем больше Вы сближаете объекты, тем больше проходите процентов и тем больше становится значение вычитаемое из значения радиуса. я не умею объяснять:)

Rzer 21.01.2014 19:22

Код AS3:

var radius:Number = Math.min(200, Point.distance(new Point(a.x, a.y), new Point(b.x, b.y));


Akopalipsis 22.01.2014 01:30

Dip52 получилось у Вас?

Dip52 22.01.2014 01:38

С процентами не разобрался.
С Math.min, можно сказать тоже, так как ставлю 200 (300,400,3000, и т.д.), и радиус всё равно маленький.

Akopalipsis 22.01.2014 01:46

Тогда чтобы понять до конца, задам ещё вопрос - у Вас есть точка, во круг её орбиты вращаются звезды. Так же есть точка В. Когда точка А сближается с точкой В до дистанции между ними равной 200, то в этот момент звезды во круг точки А начинают уменьшать свой радиус ( орбиту ) ? Правильно я понял?

Dip52 22.01.2014 02:01

Вложений: 1
Почти.
В начале, когда звёзды только появились, они находятся на расстояние от точки A на 200 пикселей.
То есть, получается, что они имеют радиус 200 пикселей.
Когда точка А приближается к точке B, то радиус должен уменьшаться, в зависимости от приближения точки А к точке B (чем ближе, тем радиус меньше, тем звезды ближе к точке A).

spaceships.swf   (4.0 Кб)


Это я сделал по алгоритму, который мне подсказали: (20 * Point.distance(new Point(STAR.x,STAR.y),points))/10;
Но этот код мне не понятен, поэтому решил узнать конкретно.

Akopalipsis 22.01.2014 02:33

А кол-во штучек, которые вращаются на орбите должно оставаться столькоже или уменьшатся в зависимости от размера окружности?

Akopalipsis 22.01.2014 02:41

Вложений: 1
Вам вот так нужно или как-то по другому?
radius.swf   (1.7 Кб)

Dip52 22.01.2014 23:12

Извините, я ошибся. То, что я хочу сделать — оно никак невыразимо.

Как можно узнать сколько нужно отнимать пикселей от радиуса, чтобы при приближение точки A к точке B радиус был равен нулю? Если я имею такие условия:
Радиус: 200 пикселей. R — расстояние, на которое звёзды отходят от точки A.
Скорость: 10 пикселей. S — скорость, с которой двигается точка A к точке B.
Расстояние: 1000 пикселей. D — расстояние от точки A до точки B.

Вопрос, изначально, был таким. Просто я немного не туда ушёл и напридумывал не то, отсюда и недопонимание.

Akopalipsis 22.01.2014 23:21

Это я если честно не то наверное показал, сам говорил о процентах, а сделал вообще другое.
Вам нужно ( если не прав то поправьте ( просто я опять читаю ваши слова и мне кажется, что нужны проценты ) ) - у Вас точка А находится центром в (300,300) и радиус у неё 200. Точка В находится (800,300) и расстояние между АВ=500. И вот Вам нужно равномерно уменьшить радиус с 200 до 0, по мере приближения А к В? Так? То есть, расстояние может между точками быть разное, но оно всегда учитывается при расчете радиуса? Так?

Dip52 22.01.2014 23:26

Да, в любом случае. Вообще, так: если расстояние 100 пикселей, скорость 10 пикселей, а радиус 200 пикселей, то, по идее, если я поделю 200 на 10 и получу 20, то 20 есть то, что нужно отнимать (от радиуса) каждый раз, когда точка приближается к другой точке. Кажется, я ответил на свой вопрос.

Akopalipsis 22.01.2014 23:29

Нет, по Вашей логике, если расстояние будет 1000 и Вы разделите на 10 то будет 100, которые Вы каждый пиксель будете отнимать от радиуса.

Добавлено через 23 минуты
я сейчас покажу, как я бы сделал, в минимальном примере.

Akopalipsis 23.01.2014 00:19

Вложений: 1
Если Вам нужно так, то Вы были почти правы, а я немного ошибся - Вам так нужно?
Эффект, какой-то не очень...
radius2.swf   (1.7 Кб)

Dip52 23.01.2014 00:44

Да, именно так.

Akopalipsis 23.01.2014 00:55

Код AS3:

package 
{
        import flash.display.Shape;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Point;
 
        public class Orbit extends Sprite
        {
                private var _target:Shape;
                private var _frameRate:Number;
                private var _isNoClick:Boolean;
 
                public function Orbit()
                {
                        stage.color = 0x000000;
                        _frameRate = stage.frameRate;
 
                        _target = new Shape();
                        _target.graphics.beginFill(0x82AC28);
                        _target.graphics.drawCircle(0, 0, 3);
                        _target.graphics.endFill();
                        _target.x = 700;
                        _target.y = 300;
                        super.addChild(_target);
 
                        _circle = new Shape();
                        _isNoClick = true;
                        stage.addEventListener(MouseEvent.CLICK, stage_click);
                }
 
                private const CIRCLE_RADIUS:uint = 200;
 
                private var _circle:Shape;
 
                private var _startX:Number;
                private var _startY:Number;
                private var _finishY:Number;
                private var _finishX:Number;
                private function stage_click(event:MouseEvent):void
                {
                        if (_isNoClick)
                        {
                                _circle.graphics.lineStyle(1, 0xCFBB2C);
                                _circle.graphics.drawCircle(0, 0, 200);
                                _circle.graphics.lineStyle(1, 0xE81313);
                                _circle.graphics.drawCircle(0, 0, 3);
                                _circle.graphics.endFill();
                                _circle.x = mouseX;
                                _circle.y = mouseY;
                                super.addChild(_circle);
 
                                _startX = _circle.x;
                                _startY = _circle.y;
 
                                _finishX = _target.x-_startX;
                                _finishY= _target.y-_startY;
 
 
                                _isNoClick = false;
                                _allTime = 0;
                                stage.addEventListener(Event.ENTER_FRAME, stage_enterFrame);
 
                        }
                }
                private var _allTime:Number;
                private var _duration:Number = 10;
                private function stage_enterFrame(event:Event):void
                {
                        var time:Number = 1 * 0.001 * _frameRate;
                        _allTime += time;
                        var ratio:Number = _allTime / _duration;
 
                        _circle.graphics.clear();
                        _circle.graphics.lineStyle(1, 0xCFBB2C);
                        _circle.graphics.drawCircle(0, 0, CIRCLE_RADIUS - CIRCLE_RADIUS/100*ratio*100);
                        _circle.graphics.lineStyle(1, 0xE81313);
                        _circle.graphics.drawCircle(0, 0, 3);
                        _circle.graphics.endFill();
 
                        if (ratio >= 1)
                        {
                                ratio = 1;
                                _isNoClick = true;
                                stage.removeEventListener(Event.ENTER_FRAME, stage_enterFrame);
                                super.removeChild(_circle);
                        }
 
                        _circle.x = ratio * _finishX + _startX;
                        _circle.y = ratio * _finishY + _startY;
 
                }
        }
 
}


Dip52 23.01.2014 21:23

CIRCLE_RADIUS - CIRCLE_RADIUS/100*ratio*100

А что за 100?

Akopalipsis 23.01.2014 22:03

CIRCLE_RADIUS - это константа минимального радиуса,
- CIRCLE_RADIUS из которой мы хотим отнять немножечко, поэтому
/100 делим её (200) на сто, переводим в проценты, 1% = 2
*ratio свойство соотношения которое в данном случаи может быть от 0 до 1, мы рассматриваем как процентную шкалу, но так как она от нуля до одного, а нам нужно же сто процентов, по этому
*100 мы её умножаем на сто.


Часовой пояс GMT +4, время: 06:45.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.