Перейти к публикации
  • Сейчас на странице   Всего пользователей: 0   (0 пользователей, 0 гостей)

Гость Lily

Паскаль Delphi Срочно нид Хелп

Рекомендованные сообщения

Гость Lily

До сегодняшнего вечера - тоесть до 5 часов по МСК нужно доделать прогу:

 

Произвольный запертый симметричный контур задается своей правой половиной(инициализировать как типизированную константу). Определить Xs, Ys, S (площадь и координаты центра веса площади) для  контура, который отсекается линией произвольного расположения вида Y=k+b снизу.

 

Делать мы начали:

 

 

program dj;

 

{$APPTYPE CONSOLE}

uses

  SysUtils;

 

  type ar = array [0..100] of integer; //типизированый тип максимум - 100 угольник

 

  var n,i,j,k:integer;

      x,y:ar;

      s,s2,YS,x1,x2,y1,y2,d,t,b,FX,FX2, YSS,r:real;

 

      label L1; //метка

 

begin

repeat

  write('Input number of points: ');

  read(n);

  writeln;

until n<50;

//n - кол-во точек Многоугольника

//(всего их будет 2n, так как симетрия относительно оси ОУ)

//Заполнение начинается сверху вниз

//1-я и последняя точки ДОЛЖНЫ ИМЕТЬ коордианту 0 по Х(для того чтоб замкнуть контур)

//И каждый следующий Y меньше или равен предыдущему

y[0]:=9999;

for i:=1 to N do

begin

    Write('x[',i,']=');

    Readln(x);

L1: Write('y[',i,']=');

    Readln(y);

    if (y>y[i-1]) or (y<0) then goto L1;  //Для того чтобы следующее значение у

                                  //было меньше предыдущего

end;

//считаем площадь(через все наши точки проводим линии перепенжикулярные ОУ)

//в итоге задача сводится к подсчету суммы прямоугольников и треугольников

//Ну трапеция разбивается как прямоугольник +- треугольник

s:=0;

for i:=1 to N-1 do

    if x=0 then s:=s+( (y-y[i+1])*x[i+1]/2)//Сумма треугольников прямоугольных

              else if x[i+1]=0 then s:=s+( (y-y[i+1])*x/2)//Перевернутый прямоугольный треугольник

                              else

                              begin

                                  s:=s+(y-y[i+1])*x;//Прямоугольник

                                  s:=s+( (y-y[i+1])*(x[i+1]-x) )/2 //Треугольник (суммируется или отнимается - зависит от трапеции)

                              end;

s:=s*2; // Поскольку фигура симетрична - левая часть равна правой, потому площадь удваивается

Writeln('S=',s:6:3);//Вывод на екран значения

 

 

 

 

//Подсчет Центра Масс

//1-е: Очевидно , что центр масс будет лежать на оси симетрии, тоесть иметь по Х координату 0

//Надо найти координату по У

//Для етого я провожу очень много прямых(для точности), которые будут отсекать от фигуры маленькие кучочки

//И копить сумму отсеченных площадей, как только ета сумма будет примерное равнятся S/2

//СЧет завершается и последняя коордианата по У - искомая

YS:=10000; //просто большое значение, чтото типо максимума

s2:=0;    //частичная сумма

FX2:=0;    //Хранение предыдущего значения Х

yss:=9999;//аналогично YS

for i:=1 to 1000 do

begin

d:=(y[1]-y[n])*i/1000;//Шаг прямой

d:=y[1]-d;//Масштабирование

for j:=1 to N-1 do

if  (y[j]>d) and (y[j+1]<=d) then k:=j; //Нашли, между какими точками фигуры лежит прямая

//y-y1=y2-y1/(x2-x1)*(x-x1) - Уравнение прямой проходящей через 2 точки  y=tx+b

r:=0;

if x[k+1]=x[k] then

 

r:=0.00001;//Для того чтоб небыло деления на ноль(возможен вариант когда прямая паралельна ОХ)

 

t:=(y[k+1]-y[k])/(x[k+1]-x[k]+r);          //Расчет коефициентов

b:=y[k]-x[k]*(y[k+1]-y[k])/(x[k+1]-x[k]+r);

 

FX:=(d-b)/t; //Точка пересечения прямой с нашей паралельной прямой

s2:=s2+(y[1]-y[n])/1000*(FX-FX2);

s2:=s2+abs( (y[1]-y[n])/1000*FX2 )*2;

if (s/2-s2<YS) and (s/2-s2>=0) then//Если сумма сверху равна сумме снизу , то ета точка - центр масс

begin

    ys:=s/2-s2;

    yss:=(y[1]-y[n])*i/1000;  //Запоминание координаты центра масс

end;

FX2:=FX;//Хранение предыдущего значения точки прямой

end;

 

 

writeln('Center mass :(',0,' ; ',yss:6:3,')');

 

readln;

 

 

//Вводишь N=3 , x1=0 y1=10 , x2=5 , y2=5 , x3=0 ,y3=0 - ето ромб(даже квадрат) - результаты правильны

//Вводишь N=4 , x1=0 y1=10 , x2=2,y2=10, x3=2,y3=0 ,x4=0 ,y4=0 - (Прямоугольник) - результаты правильны

//Ну можешь для 100 угольника проверить, должно работать, мне облом было те координаты считать

//Главное запомни ЧТО ОСЬ СИМЕТРИИ ето ОУ, и 1-е значение Х и последнее должно быть 0 (для замкнутой Области)

//С прямой я не делал, там надо углублятся совсем в метод координат, я думаю такую математику вы не учили+там Надо много что учитывать

//Точность моего метода - абсолютная точность для площи(с корректными данными) и 0,1% погрешности для метода вычисленя центра масс

 

 

end.

 

 

 

То, что я выделила жирным в коде - это ввод с клавиатуры координат фигур. Надо убрать ввод с клавиатуры, задать константами. Константы :

 

- координаты b и k, где k=1, b=5 - это данные для линии вида y=kx+b

-  (0,10), (5, 5), (0,0) - Это координаты фигуры. - Симметри относительно оси оу, фигура - ромбик.

 

Та, прога, что мы делали, считает площадь и центр масс начальной фигуры, тоесть нашего ромбика. Надо доделать с прямой часть задания, то есть задать в константах прямую, потом как-то высчитать площадь и центр масс нижней фигуры. В общем, кто шарит в этом, помогите пожайлуста. Стучите в аську, в пм или отписывайтесь в топике, это очень срочно.

 

P.S. Препод - идиот, который не пойми че хочет. Это я знаю, писать не надо. Сказал убрать ввод с клавиатуры, типа если захочешь проверить другую фигуру, копайся в исходнике, меняй константы. ЭТО ТУПО. Но с меня так требуют. И сказал упростить формулы, но я хз как. Спасайте...

Поделиться сообщением


Ссылка на сообщение
Гость Чтиво

Я бы помог, но удалил делфи.

Поделиться сообщением


Ссылка на сообщение

упрощение вижу лишЪ в подчете коэффициэнтов. И подсчете площадей. И пиздец уточняющих данных. Мы с такой точностью тольок для физиков писали.


одолели юзербары :yes:

Поделиться сообщением


Ссылка на сообщение
Гость Man1ak

:xboard:

Поделиться сообщением


Ссылка на сообщение

увидел бы тему раньше мб помог

 

ничётак задачка бтв, зря на препода гонишь

 

сделал для ромбика:

gallery_4587_1004_39384.jpg

 

вроде сходится с аналитическим решением:

gallery_4587_1004_3569.jpg

 

в исходнике кстати у массивов не стоят индексы, хз как он проверял если даже этот исходник не компилился, пришлось ещё фиксить вручную

 

упрощение вижу лишЪ в подчете коэффициэнтов. И подсчете площадей. И пиздец уточняющих данных. Мы с такой точностью тольок для физиков писали.

можно оптимизировать, подсчет цм идет методом бисекций, в принципе если сделать ньютоном или секущими, то сожно добится сокращения числа итераций с 40 до 5 к примеру


OFFICIAL ANTIKAKEL SQUAD LEADER 6f042ff1e9.png

Поделиться сообщением


Ссылка на сообщение

:geys:

warnwarn.gif не флуди


ОРК

200px-Azov_Batallion_logo.jpg

СПЕЦПIДРОЗДIЛ МВС УКРАIНИ

Поделиться сообщением


Ссылка на сообщение

домой приду с универа - подумаю. Недавно че-то писал подобное.

Сейчас еще в универе, но есть идея для реализации на турбопаскале для любого выпуклого многоугольника. Насчет произвольного , хз на вид уж очень много вариантов пересечений, а получающиеся фигуры это вообще нк


WoW POE

Поделиться сообщением


Ссылка на сообщение
Гость Lily

Всем спасибо, Сашу люблю, сдала :spydance:

 

Тему клоз. Если кому-то понадобится код проги(мало-ли, то пишите в пм или в аську)

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...