|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.12.2007, 11:51 | #1 |
Пользователь
Регистрация: 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; // Нарисовать модель..... |
12.12.2007, 12:07 | #2 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Есть проблема. У меня Delphi 7 без SpenEdit'ов. Исходник посмотреть не могу. Поэтому не понял вопрос.
Опиши суть вопроса без: N, DK, CDK, DK, NF, F Что это, я не знаю. А по коду в ручную разобраться немыслемо. |
12.12.2007, 12:20 | #3 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Хотя для начала отмечу, что при использовании динамических массивов в разделе uses главной программы (*.dpr) необходимо прописывать модуль sharemem.
|
12.12.2007, 12:42 | #5 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Я так понимаю, нужна координата точки N при изменении угла поворота отрезки AB
Ждите ответа ... Ждите ответа ... Ждите ответа ... ... |
12.12.2007, 18:54 | #6 |
Пользователь
Регистрация: 20.02.2007
Сообщений: 12
|
АВ является тут ведущем звеном (приводит в движение все остальное )
АВ толкает отрезок ВС , ВС заставляет поворачиваться CDK , при повороте CDK точка N должна перемещаться по DK, точка F жестко закреплена , отрезок NF имеет постоянную длину (Я не знаю как задать тут передвижение точки ----N---- по отрезку ---DK---) Прога MY_KUR1.rar Рисунок vid.JPG |
12.12.2007, 19:35 | #7 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Все просто. Решил для всех точек. Мозги размял.
Нахождение точек.zip ::: Тока у меня мозги деревянные. Лучше сам еще проверь Последний раз редактировалось Sibedir; 12.12.2007 в 19:43. |
12.12.2007, 21:07 | #8 |
Пользователь
Регистрация: 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' |
14.12.2007, 10:08 | #9 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Готово
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Отбражение чисел - точки, это точки, а не запятые, обозначающие дробную часть | Дикий | Помощь студентам | 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 |