Математический форум Math Help Planet
http://mathhelpplanet.com/

Доступ к компоненту массива Table внутри Table
http://mathhelpplanet.com/viewtopic.php?f=24&t=46976
Страница 2 из 3

Автор:  Excalibur921 [ 28 янв 2016, 18:39 ]
Заголовок сообщения:  Re: Доступ к компоненту массива Table внутри Table

Спасибо, но формула теперь неправильно считает и смысла не имеет. Не берет xA и углы уплыли =(. Очень странная работа Dynamic, видимо они не правильно обновляют таймер или координаты мышки. Я новичок и как не пытался заставить работать правильно не выходит. Моя задача интерактивно таскать точки и делать расчеты с ними но не выходит.

Подскажете как с RunScheduledTask обновлять координаты точки на графике от координат мышки?

Или помочь накидать код таскания одной точки? Наверно с RunScheduledTask.
=====================
RadiusClick=12
MouseClick = X,Y нажатия левой кнопки
--------------
--------------
прерывание таймера timer0
Если { RascZakon4en==1}
то {вывод графики из буфера}
иначе выход
}
--------------
--------------
Отпуск левой кнопки мышки{
если LmouseDown!=1
то выход
иначе LmouseDown=0
timer0=0 остановка таймера
}
--------------
--------------
Нажатие левой кнопки мышки
{
Если {"расстояние MouseClick и xA yA">RadiusClick} // не попадание на точку A
то {выход}
иначе {LmouseDown=1,запуск таймера с циклами 0.016 сек timer0=1}
}
--------------
--------------
Если {LmouseDown==1}
то RascZakon4en=0,(много расчетов основной код программы),(отрисовка графики в буфер),RascZakon4en=1}
--------------

Автор:  SAVANTOS [ 28 янв 2016, 18:58 ]
Заголовок сообщения:  Re: Доступ к компоненту массива Table внутри Table

Можно попробовать конструкцию с Manipulate, используя Locator.

Автор:  Excalibur921 [ 28 янв 2016, 19:33 ]
Заголовок сообщения:  Re: Доступ к компоненту массива Table внутри Table

SAVANTOS писал(а):
Можно попробовать конструкцию с Manipulate, используя Locator.

Также и ее пробовал. Лаги еще больше. Я думаю лучше чем с RunScheduledTask
Простого таскания точки ничего не будет. Сделать расчет внутри функции а вывод в другой по алгоритму выше, но не знаю синтаксиса, пытался но ничего…

Все-таки хотелось бы сделать в Mathematica т.к. дальше хочу попробовать многопараметрическую нелинейную оптимизацию. Но все больше склоняюсь что намного быстрей сделать все самому на С++( и возможно с ассемблерными вставками) и OpenGL изучив и разобрав методы оптимизации...

Автор:  SAVANTOS [ 28 янв 2016, 20:32 ]
Заголовок сообщения:  Re: Доступ к компоненту массива Table внутри Table

Я вам написал ЛС с информацией куда можно обратиться к профессионалам за помощью.

Автор:  Excalibur921 [ 28 янв 2016, 21:15 ]
Заголовок сообщения:  Re: Доступ к компоненту массива Table внутри Table

SAVANTOS писал(а):
Я вам написал ЛС

Так я ответил давно.

А может тут подскажете почему не работают?
RunScheduledTask[a0=MousePosition[{"Graphics",Graphics},{0,0}],3],
Graphics[
Point[[a0]]
]

Slider[Dynamic[a],{0,10}];
ControllerManipulate[Plot[{Sin[x+a]+b,Sinc[x+c]+d},{x,-2Pi,2Pi},PlotRange2],{a,0,10},{b,0,1},{c,0,10},{d,0,1}]

Автор:  SAVANTOS [ 29 янв 2016, 11:42 ]
Заголовок сообщения:  Re: Доступ к компоненту массива Table внутри Table

Я с такими конструкциями не сталкивался, поэтому не могу сказать.

Автор:  Excalibur921 [ 29 янв 2016, 15:10 ]
Заголовок сообщения:  Re: Доступ к компоненту массива Table внутри Table

Исправил, всеравно не хочет читать с массива p1[[]].
Причина всего в двух строчках: может нужно data=Table… не понимаю как сделать.
Или записать array а в Table просто брать типа Array[1,1]. Указатель но как не знаю не хочет. Это наверно самый лучший вариант.
(*-----Eror----*)
(*p0[{1,1}]+(Cos[Angle]*0.2), (*<--------------------------Eror*)
p0[{1,2}]+(Sin[Angle]*0.2)*)
(*-----Eror----*)
Вот готовый фаил работает:
https://dropmefiles.com/YAjZp

Автор:  Excalibur921 [ 29 янв 2016, 16:30 ]
Заголовок сообщения:  Re: Доступ к компоненту массива Table внутри Table

И так не хочет:
Angle2 = 0.1; 
p1 = Dynamic@Table[
{
If[Angle2 > 2*Pi, Angle2 = Angle2 - (2*Pi)];(* if more 2 Pi*)
Angle2 = Angle2 + AngleStep; (* add AngleStep*)
(*
(xA+Cos[StartAngle]*AB)+(Cos[Angle2]*0.2), (*<----------it works*)
(yA+Sin[StartAngle]*AB)+(Sin[Angle2]*0.2)*)
(*-----Eror----*)
p2[[p, 1]] + (Cos[Angle2]*0.2), (*<--------------------------Eror*)
p2[[p, 2]] + (Sin[Angle2]*0.2)
(*-----Eror----*)
},
{p, 1, Positions + 1}];

Автор:  Excalibur921 [ 29 янв 2016, 19:31 ]
Заголовок сообщения:  Re: Доступ к компоненту массива Table внутри Table

Теперь работает правильно, сделал через адекватные массивы и циклы. Как я и думал те рукожопы из wolfram намудрили в Table.
Баг 1. Если в Table1 бралась переменная, то ее нельзя брать в Table2. Сбоит в формуле и не говорит об ошибке.
Баг2. Указатели на массив типа
a1[[i,1]]=a0[[2,1]]+Cos[Angle2]*0.2;
Не будут работать внутри Table, вообще в Table лучше рисовать точки и ничего не считать.
Суть: создается пустой массив, в For заполняется, в Table пробегает по указателям на массив. По другому не пашет не знаю, 5 форумов не помогли =)… вообще жутко лаговая вещь эта Mathematica.

{xA, yA} = {0, 0};
{xB, yB} = {0.25, 0.25};
Positions = 10;
AngleStep = (2 Pi)/Positions;
AB = Dynamic[EuclideanDistance[{xA, yA}, {xB, yB}]];(*----length AB must updated*)
StartAngle = Dynamic[Mod[ArcTan[xB - xA, yB - yA], 2 Pi]];(*---Start Angle AB must updated*)
Angle = StartAngle;
(*---------------------------------------------*)
a0 = Array[0 &, {Positions, 2}];
a1 = Array[0 &, {Positions, 2}];
(*---------Array B-------------------------*)
For[i = 1, i < Positions + 1, i++,
If[Angle > 2*Pi, Angle = Angle - (2*Pi)];(* if more 2 Pi*)
Angle = Angle + AngleStep; (* add AngleStep*)
a0[[i, 1]] = Dynamic@xA + Cos[Angle]*AB;
a0[[i, 2]] = Dynamic@yA + Sin[Angle]*AB
];
(*-------------------------*)
p0 = Table[{
a0[[t, 1]],
a0[[t, 2]]},
{t, 1, Positions}];
(*---------Array B-------------------------*)
(*---------Array C-------------------------*)
Angle2 = 0.1;
For[i = 1, i < Positions + 1, i++,
If[Angle2 > 2*Pi, Angle2 = Angle2 - (2*Pi)];(* if more 2 Pi*)
Angle2 = Angle2 + AngleStep; (* add AngleStep*)
a1[[i, 1]] = a0[[2, 1]] + Cos[Angle2]*0.2;
a1[[i, 2]] = a0[[2, 2]] + Sin[Angle2]*0.2
];
p1 = Table[{
a1[[t, 1]],
a1[[t, 2]]
}, {t, 1, Positions}];
(*---------Array C-------------------------*)
Graphics[
{
RGBColor[10, 0, 0],
PointSize[0.03],
Point[Dynamic[{xA, yA}]],
Point[Dynamic[{xB, yB}]],
Line[{Dynamic[{xA, yA}], Dynamic[{xB, yB}]}],
RGBColor[0, 0, 0],
PointSize[0.02],
Point[p0],
Point[p1],
Locator[Dynamic[{xA, yA}], None],
Locator[Dynamic[{xB, yB}], None]
},
AspectRatio -> 1, Axes -> True, PlotRange -> 1]

Автор:  SAVANTOS [ 29 янв 2016, 21:44 ]
Заголовок сообщения:  Re: Доступ к компоненту массива Table внутри Table

Процедурный стиль программирования не любят в Wolfram Mathematica. Обычно всё делают в функциональном стиле.

Страница 2 из 3 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/