Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2007, 11:51   #1
Stark[SG!]
Пользователь
 
Регистрация: 20.02.2007
Сообщений: 12
Вопрос Помогите рассчитать положение и движение точки N на отрезку DK

Всем привет
Нужна помощь в описании одной точки (хз как это сделать )
У отрезка NF длина должна быть постоянна , а точка N должна ездить по отрезку DK. Когда CDK поворачивается то точка N перемещается вниз по отрезку DK при этом длина NF не изменяется (точка F должна быть закреплена ) вот в общем то все
(полный код программы MY_KUR.rar)
[CODE]


// Создание новой модели--------------------------------------------------------
constructor TMyModel.Create(BeginX, BeginY: integer; Angles: array of real; Lengths: array of real; CD, DK: integer);
var
temp1, temp2: real;
i: integer;
begin
Points[0]:= TMyPoint.Create(BeginX, BeginY, Angles[0], Lengths[0]);
for i:= 1 to 3 do
begin
temp1:= PointPositionX(Points[i-1].PosX, Points[i-1].Length, Points[i-1].angle);
temp2:= PointPositionY(Points[i-1].PosY, Points[i-1].Length, Points[i-1].angle);
Points[i]:= TMyPoint.Create(temp1, temp2, Angles[i], Lengths[i]);
end;
Points[4]:= TMyPoint.Create(temp1, temp2, Angles[3], CD);
temp1:= PointPositionX(Points[2].PosX, DK, Points[2].angle);
temp2:= PointPositionY(Points[2].POsY, DK, Points[2].angle);
Points[5]:= TMyPoint.Create(temp1, temp2, Angles[5], DK);
Temp1:= PointPositionX(Points[3].PosX, CD, Points[3].angle);
Temp1:= PointPositionY(Points[3].PosY, CD, Points[3].angle);


temp1:= PointPositionX(Points[5].PosX, 50 , Points[5].angle);
temp2:= PointPositionY(Points[5].PosY, 50 , Points[5].angle);
Points[6]:= TMyPoint.Create(temp1, temp2, Angles[6],Lengths[6]);

temp1:= PointPositionX(Points[6].PosX, 60 , Points[6].angle);
temp2:= PointPositionY(Points[6].PosY, 60 , Points[6].angle);
Points[7]:= TMyPoint.Create(temp1, temp2, Angles[7],60);

end;



// Переместить модель на 1 шаг -------------------------------------------------
procedure TMyModel.Move(ObjectToAdd: TStringGrid; Step1: real);
var
UD, CD, FiB, FiC, Temp , Temp2, HH: real;
begin
// Изменяем угол для отрезка AB
ii:= Step1;
if i < 0 then
ii:= ii * -1;
if Points[3].PosX <= Points[1].PosX then
Roll:= False;
if Points[3].Length >= Points[1].Length then
Roll:= True;
if Roll = False then
ii:= ii * -1;
Points[0].Angle:= Points[0].Angle - ii;

// Высчитываем положение точки В
Points[1].PosX:= Points[0].PosX + Points[0].Length * Cos(DegToRad(Points[0].Angle));
Points[1].PosY:= Points[0].PosY - Points[0].Length * Sin(DegToRad(Points[0].Angle));
// Высчитываем положение точки С
// Если 1x < 3x тогда заменить местами точки.
CD:= Sqrt((Points[1].PosX-Points[3].PosX)*(Points[1].PosX-Points[3].PosX)+(Points[1].PosY-Points[3].PosY)*(Points[1].PosY-Points[3].PosY));
FiB:= ArcTan(((Points[1].PosY-Points[3].PosY)/CD)/((Points[1].PosX-Points[3].PosX)/CD));
UD:= (Points[2].Length*Points[2].Length + CD*CD - Points[1].Length*Points[1].Length)/(2*CD*Points[2].Length);
if (UD < -1) or (UD > 1) then
begin
i:= i* -1;
exit;
end;
UD:= RadToDeg(ArcCos(UD));
FiB:= RadToDeg(FiB);
if Points[1].PosX <= Points[3].PosX then
begin
FiC:= FiB + UD;
Points[2].Angle:= (360 - UD - FiB);
Points[2].PosX:= Points[3].PosX - Points[2].Length*Cos(DegToRad(FiC));
Points[2].PosY:= Points[3].PosY - Points[2].Length*Sin(DegToRad(FiC));
end
else
begin
FiC:= FiB - UD;
Points[2].Angle:= FiB + UD;
Points[2].PosX:= Points[3].PosX + Points[2].Length*Cos(DegToRad(FiC));
Points[2].PosY:= Points[3].PosY + Points[2].Length*Sin(DegToRad(FiC));
end;
// Высчитываем угол точки B
Temp:= (Points[1].PosY - Points[2].PosY) / Points[1].Length;
Points[1].Angle:= RadToDeg(ArcSin(Temp));
// Высчитываем угол и положение точки D (DK)
Points[4].Angle:= Points[2].Angle;
Points[4].PosX:= PointPositionX(Points[2].PosX, Points[4].Length, Points[4].angle);
Points[4].PosY:= PointPositionY(Points[2].PosY, Points[4].Length, Points[4].angle);
// Высчитываем угол и положение точки K (DK)
Points[5].Angle:= Points[4].Angle + 150;
Points[5].PosX:= PointPositionX(Points[4].PosX, Points[5].Length, Points[5].angle);
Points[5].PosY:= PointPositionY(Points[4].PosY, Points[5].Length, Points[5].angle);

// Высчитываем угол и положение точки N

Points[6].Angle:= Points[5].Angle ;
Points[6].PosX:= PointPositionX(Points[4].PosX, Points[5].Length-20, Points[6].angle);
Points[6].PosY:= PointPositionY(Points[4].PosY, Points[5].Length-20, Points[6].angle);

// точка F
HH:=60;
Points[7].Angle:= Points[6].Angle-140 ;
Points[7].PosX:= Points[4].PosX+50;
Points[7].PosY:= Points[4].PosY;

// Нарисовать модель.....
Stark[SG!] вне форума Ответить с цитированием
Старый 12.12.2007, 12:07   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Есть проблема. У меня Delphi 7 без SpenEdit'ов. Исходник посмотреть не могу. Поэтому не понял вопрос.
Опиши суть вопроса без: N, DK, CDK, DK, NF, F
Что это, я не знаю. А по коду в ручную разобраться немыслемо.
Sibedir вне форума Ответить с цитированием
Старый 12.12.2007, 12:20   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Хотя для начала отмечу, что при использовании динамических массивов в разделе uses главной программы (*.dpr) необходимо прописывать модуль sharemem.
Sibedir вне форума Ответить с цитированием
Старый 12.12.2007, 12:32   #4
Stark[SG!]
Пользователь
 
Регистрация: 20.02.2007
Сообщений: 12
По умолчанию

Точка A закреплена отрезок AB является ведущем звеном и следовательно приводит в движение отрезок BC , BC приводит в движение отрезок CD DK , по отрезку DK будет перемещаться точка N vid.JPG
Stark[SG!] вне форума Ответить с цитированием
Старый 12.12.2007, 12:42   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Я так понимаю, нужна координата точки N при изменении угла поворота отрезки AB
Ждите ответа ...
Ждите ответа ...
Ждите ответа ...
...
Sibedir вне форума Ответить с цитированием
Старый 12.12.2007, 18:54   #6
Stark[SG!]
Пользователь
 
Регистрация: 20.02.2007
Сообщений: 12
По умолчанию

АВ является тут ведущем звеном (приводит в движение все остальное )
АВ толкает отрезок ВС , ВС заставляет поворачиваться CDK , при повороте CDK точка N должна перемещаться по DK, точка F жестко закреплена , отрезок NF имеет постоянную длину
(Я не знаю как задать тут передвижение точки ----N---- по отрезку ---DK---)

Прога MY_KUR1.rar
Рисунок vid.JPG
Stark[SG!] вне форума Ответить с цитированием
Старый 12.12.2007, 19:35   #7
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Все просто. Решил для всех точек. Мозги размял.
Нахождение точек.zip

::: Тока у меня мозги деревянные. Лучше сам еще проверь

Последний раз редактировалось Sibedir; 12.12.2007 в 19:43.
Sibedir вне форума Ответить с цитированием
Старый 12.12.2007, 21:07   #8
Stark[SG!]
Пользователь
 
Регистрация: 20.02.2007
Сообщений: 12
По умолчанию

А если в программном коде (DELPHI) это будет как выглядеть ?????
(правда точку ---C--- и ---K--- по другим формулам искали )
Вот точки А B C В Л нашли так (ниже код программы )
// Переместить модель на 1 шаг -------------------------------------------------
procedure TMyModel.Move(ObjectToAdd: TStringGrid; Step1: real);
var
UD, CD, FiB, FiC, Temp , Temp2, HH: real;
begin
// Изменяем угол для отрезка AB
ii:= Step1;
if i < 0 then
ii:= ii * -1;
if Points[3].PosX <= Points[1].PosX then
Roll:= False;
if Points[3].Length >= Points[1].Length then
Roll:= True;
if Roll = False then
ii:= ii * -1;
Points[0].Angle:= Points[0].Angle - ii;

// Высчитываем положение точки В
Points[1].PosX:= Points[0].PosX + Points[0].Length * Cos(DegToRad(Points[0].Angle));
Points[1].PosY:= Points[0].PosY - Points[0].Length * Sin(DegToRad(Points[0].Angle));
// Высчитываем положение точки С
// Если 1x < 3x тогда заменить местами точки.
CD:= Sqrt((Points[1].PosX-Points[3].PosX)*(Points[1].PosX-Points[3].PosX)+(Points[1].PosY-Points[3].PosY)*(Points[1].PosY-Points[3].PosY));
FiB:= ArcTan(((Points[1].PosY-Points[3].PosY)/CD)/((Points[1].PosX-Points[3].PosX)/CD));
UD:= (Points[2].Length*Points[2].Length + CD*CD - Points[1].Length*Points[1].Length)/(2*CD*Points[2].Length);
if (UD < -1) or (UD > 1) then
begin
i:= i* -1;
exit;
end;
UD:= RadToDeg(ArcCos(UD));
FiB:= RadToDeg(FiB);
if Points[1].PosX <= Points[3].PosX then
begin
FiC:= FiB + UD;
Points[2].Angle:= (360 - UD - FiB);
Points[2].PosX:= Points[3].PosX - Points[2].Length*Cos(DegToRad(FiC));
Points[2].PosY:= Points[3].PosY - Points[2].Length*Sin(DegToRad(FiC));
end
else
begin
FiC:= FiB - UD;
Points[2].Angle:= FiB + UD;
Points[2].PosX:= Points[3].PosX + Points[2].Length*Cos(DegToRad(FiC));
Points[2].PosY:= Points[3].PosY + Points[2].Length*Sin(DegToRad(FiC));
end;
// Высчитываем угол точки B
Temp:= (Points[1].PosY - Points[2].PosY) / Points[1].Length;
Points[1].Angle:= RadToDeg(ArcSin(Temp));
// Высчитываем угол и положение точки D (DK)
Points[4].Angle:= Points[2].Angle;
Points[4].PosX:= PointPositionX(Points[2].PosX, Points[4].Length, Points[4].angle);
Points[4].PosY:= PointPositionY(Points[2].PosY, Points[4].Length, Points[4].angle);
// Высчитываем угол и положение точки K (DK)
Points[5].Angle:= Points[4].Angle + 150;
Points[5].PosX:= PointPositionX(Points[4].PosX, Points[5].Length, Points[5].angle);
Points[5].PosY:= PointPositionY(Points[4].PosY, Points[5].Length, Points[5].angle);
-----------------------------
Points[0]--'А'
Points[2]--'B'
Points[3]--'C'
Points[4]--'D'
Points[5]--'K'
Stark[SG!] вне форума Ответить с цитированием
Старый 14.12.2007, 10:08   #9
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
Лампочка Готово

Рабочий вариант программы
Механизм.zip
Я немного упростил описание точек.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отбражение чисел - точки, это точки, а не запятые, обозначающие дробную часть Дикий Помощь студентам 7 12.05.2008 17:57
движение точки на Canvas st01en Общие вопросы Delphi 32 09.02.2008 22:29
Помогите сделать движение объектов в Pascal Ivanich Помощь студентам 44 11.12.2007 20:33
Даны три числа. Выберите те из них, которые принадлежат заданному отрезку [а, b]. Sheff903 Помощь студентам 1 27.11.2007 21:28
Help!!!Движение точки по поверхности сферы alex23xandr Помощь студентам 4 20.05.2007 14:45