Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Flash > ActionScript

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 29.03.2002, 17:52
[subway]design вне форума Посмотреть профиль Отправить личное сообщение для [subway]design Посетить домашнюю страницу [subway]design Найти все сообщения от [subway]design
  № 1  
[subway]design
 
Аватар для [subway]design

Регистрация: Oct 2001
Адрес: в Петербурге
Сообщений: 2,430
По умолчанию [MX] Западло curveTo()

Вот функция:
Код:
  
function circle(obj, x, y, r) {
	//
	with (obj) {
		//
		moveTo(x-r, y);
		beginFill(0x003366);
		curveTo(x-r, y-r, x, y-r);
		curveTo(x+r, y-r, x+r, y);
		curveTo(x+r, y+r, x, y+r);
		curveTo(x-r, y+r, x-r, y);
		endFill();
		//	
	}
	//
}
Рисует синий кружочек в нужном муве (obj) с заданными координатами и радиусом. Что из этого получается - смотрите на скриншот.

Судя по всему, кривые реализованы как-то неправильно, поэтому я ввел поправочный коэффициент для координат углов квадрата (в него вписана окружность), так, что эти углы "убираются" внутрь него и поправляют контур круга:

Код:
  
function circle(obj, x, y, r,k) {
	//
	with (obj) {
		//
		moveTo(x-r, y);
		beginFill(0x003366);
		curveTo(x-r*k, y-r*k, x, y-r);
		curveTo(x+r*k, y-r*k, x+r, y);
		curveTo(x+r*k, y+r*k, x, y+r);
		curveTo(x-r*k, y+r*k, x-r, y);
		endFill();
		//	
	}
	//
}
Вот таблица для экспериментальных радиусов:
Код:
 
радиус (px)   |   k
______________|_______
              |              
    10        |  0.9    
    50        |  0.96 
   100        |  0.97
              |
Но при изменении k заметны углы на стыках кривых. Так как же быть?
Изображения
 
__________________
subway.net.ru

Старый 29.03.2002, 19:04
Хрюндик вне форума Посмотреть профиль Отправить личное сообщение для Хрюндик Посетить домашнюю страницу Хрюндик Найти все сообщения от Хрюндик
  № 2  
Хрюндик
 
Аватар для Хрюндик

Регистрация: Sep 2000
Сообщений: 326
Отправить сообщение для Хрюндик с помощью ICQ
хех, ты глянь в мокромедийный исходник в хелпе, у них тоже скругленный квалрат рисуется ))))....
имхо я рисовал пикселями через синусы и косинусы... правда с заливкой траблы (((....

зы: наверное программеры из мокрой писали эту фичу в пьяном угаре(там среди них два русских ))) ))))...

Старый 29.03.2002, 19:10
Дениска вне форума Посмотреть профиль Отправить личное сообщение для Дениска Посетить домашнюю страницу Дениска Найти все сообщения от Дениска
  № 3  
Дениска
"редиска"

Регистрация: Jun 1999
Адрес: www.cleoag.ru
Сообщений: 1,240
Отправить сообщение для Дениска с помощью ICQ
способ 1:
рисование окружностей 2-мя ПРЯМЫМИ линиями

function drawCircle(x, y, radius, cWidth) {
mc = _root.createEmptyMovieClip("circle"+cnt, ++cnt);
mc.lineStyle(radius, 0x000000, 100);
mc.moveTo(x, y);
mc.lineTo(x, y+.15);
mc.lineStyle(radius-cWidth, 0xffffff, 100);
mc.moveTo(x, y);
mc.lineTo(x, y+.15);
}
function redraw() {
cnt = 0;
for (i=0; i<100; i++) {
drawCircle(random(750), random(430), 10+random(150), 1+random(10));
}
}
redraw();
stop();


способ2:

function drawCircle(x, y, radius, startAngle, endAngle) {
segm = (endAngle-startAngle)/5;
this.moveTo(x+radius*Math.cos(startAngle*Math.rad), y+radius*Math.sin(startAngle*Math.rad));
for (var s = startAngle+segm; s<=endAngle+1; s += segm) {
var c_x = radius*Math.cos(s*Math.rad);
var c_y = radius*Math.sin(s*Math.rad);
var a_x = c_x+radius*Math.tan(segm/2*Math.rad)*Math.cos((s-90)*Math.rad);
var a_y = c_y+radius*Math.tan(segm/2*Math.rad)*Math.sin((s-90)*Math.rad);
this.curveTo(a_x+x, a_y+y, c_x+x, c_y+y);
}
}

_root.drawCircle(100, 100, 50, 0, 360);
__________________
cleoag.ru

Старый 29.03.2002, 19:19
Хрюндик вне форума Посмотреть профиль Отправить личное сообщение для Хрюндик Посетить домашнюю страницу Хрюндик Найти все сообщения от Хрюндик
  № 4  
Хрюндик
 
Аватар для Хрюндик

Регистрация: Sep 2000
Сообщений: 326
Отправить сообщение для Хрюндик с помощью ICQ
beep, Дениска, а можно поподробнее, плз...

Старый 29.03.2002, 21:40
[subway]design вне форума Посмотреть профиль Отправить личное сообщение для [subway]design Посетить домашнюю страницу [subway]design Найти все сообщения от [subway]design
  № 5  
[subway]design
 
Аватар для [subway]design

Регистрация: Oct 2001
Адрес: в Петербурге
Сообщений: 2,430
2 Дениска:

Способ №1 - все гениальное воистину просто!

только прозрачную дырку не нарисуешь ;-)
__________________
subway.net.ru

Старый 30.03.2002, 10:03
Дениска вне форума Посмотреть профиль Отправить личное сообщение для Дениска Посетить домашнюю страницу Дениска Найти все сообщения от Дениска
  № 6  
Дениска
"редиска"

Регистрация: Jun 1999
Адрес: www.cleoag.ru
Сообщений: 1,240
Отправить сообщение для Дениска с помощью ICQ
Цитата:
Оригинал написал(а) Хрюндик
beep, Дениска, а можно поподробнее, плз...
в каком месте непонятно?
__________________
cleoag.ru

Старый 30.03.2002, 10:13
Хрюндик вне форума Посмотреть профиль Отправить личное сообщение для Хрюндик Посетить домашнюю страницу Хрюндик Найти все сообщения от Хрюндик
  № 7  
Хрюндик
 
Аватар для Хрюндик

Регистрация: Sep 2000
Сообщений: 326
Отправить сообщение для Хрюндик с помощью ICQ
Если честно, то не понял как двумя ПРЯМЫМИ можно нарисовать окружность????!!!!....
как оно вообще работает(строки прокомментируй просто )

Старый 30.03.2002, 12:13
Aib вне форума Посмотреть профиль Отправить личное сообщение для Aib Посетить домашнюю страницу Aib Найти все сообщения от Aib
  № 8  
Aib

Регистрация: Oct 2001
Адрес: Россия, Казань
Сообщений: 270
Из параболы окружность не сделаешь, только приблизительно.
Ловите метод, риует эллипс (или его часть) под заданным углом. Точность - 927/1000.
Код:
function Ellipse(CenterX, CenterY, ARadius, BRadius, ARadAngle){
	if (arguments.length == 7){
		if (arguments[6] >= arguments[5]){
			var StartAngle = arguments[5];
			var EndAngle = arguments[6];
		} else {
			var StartAngle = arguments[6];
			var EndAngle = arguments[5];

		};
		var div = Math.ceil((EndAngle-StartAngle)/30)
		var delta = (EndAngle-StartAngle)/div;
	} else {
		var StartAngle = 0;
		var div = 12;
		var delta = 30;
	};
	with (Math){
		var ABRadius = ARadius/cos(PI*delta/360);
		var BBRadius = BRadius/cos(PI*delta/360);
		var te = round(ARadius*cos(PI*StartAngle/180)*10)/10;
		var Y1 = round(BRadius*sin(PI*StartAngle/180)*10)/10;
		var X1 = CenterX+te*cos(PI*ARadAngle/180)-Y1*sin(PI*ARadAngle/180);
		Y1 = CenterY-te*sin(PI*ARadAngle/180)-Y1*cos(PI*ARadAngle/180);
		var X2;
		var Y2;
		this.moveTo (X1, Y1);
		for (var i = 1; i<=div; i++){
			te = round(ABRadius*cos(PI*(StartAngle+delta*(i-0.5))/180)*10)/10;
			Y1 = round(BBRadius*sin(PI*(StartAngle+delta*(i-0.5))/180)*10)/10;
			X1 = CenterX+te*cos(PI*ARadAngle/180)-Y1*sin(PI*ARadAngle/180);
			Y1 = CenterY-te*sin(PI*ARadAngle/180)-Y1*cos(PI*ARadAngle/180);
			te = round(ARadius*cos(PI*(StartAngle+delta*i)/180)*10)/10;
			Y2 = round(BRadius*sin(PI*(StartAngle+delta*i)/180)*10)/10;
			X2 = CenterX+te*cos(PI*ARadAngle/180)-Y2*sin(PI*ARadAngle/180);
			Y2 = CenterY-te*sin(PI*ARadAngle/180)-Y2*cos(PI*ARadAngle/180);
			this.curveTo (X1, Y1, X2, Y2);
		};
	};
	return this;
}
Object.prototype.ellipseTo = Ellipse;
__________________
The war does not determine who is right. Only who is left.

Старый 30.03.2002, 12:19
Aib вне форума Посмотреть профиль Отправить личное сообщение для Aib Посетить домашнюю страницу Aib Найти все сообщения от Aib
  № 9  
Aib

Регистрация: Oct 2001
Адрес: Россия, Казань
Сообщений: 270
Да, про аргументы:
CenterX - координата X центра пересечения радиусов
CenterY - координата Y центра пересечения радиусов
ARadius - радиус А
BRadius - радиус B
ARadAngle - угол наклона радиуса А
StartAngle - начальный угол сегмента
EndAngle - конечный угол сегмента.

Последние два параметра можно не задавать. Тогда нарисуется эллипс целиком.

2Хрюндик. Никакого пьяного угара. Обычный NURBS
__________________
The war does not determine who is right. Only who is left.

Старый 30.03.2002, 15:29
Хрюндик вне форума Посмотреть профиль Отправить личное сообщение для Хрюндик Посетить домашнюю страницу Хрюндик Найти все сообщения от Хрюндик
  № 10  
Хрюндик
 
Аватар для Хрюндик

Регистрация: Sep 2000
Сообщений: 326
Отправить сообщение для Хрюндик с помощью ICQ
beep, офигеть! Жаль что мы еще эту чушь не проходили в школе

Создать новую тему   Часовой пояс GMT +4, время: 21:46.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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