From 91a751084d72fa60cdc227ec231488a0c5525aec Mon Sep 17 00:00:00 2001 From: Benjamin-Sitbon <Benjaminsitbon@hotmail.com> Date: Thu, 13 Jun 2019 18:21:59 +0200 Subject: [PATCH] Vector made same fonction without pointers to make easier star fonctions --- .idea/workspace.xml | 133 +++++++++++++++++++--------------------- Box.c | 2 + Star.c | 144 +++++++++++++++++++++++++++++++++++--------- Star.o | Bin 1472 -> 7576 bytes Vector.c | 45 ++++++++++++++ Vector.h | 7 ++- Vector.o | Bin 7880 -> 9024 bytes galaxy_simulation | Bin 18192 -> 22736 bytes 8 files changed, 230 insertions(+), 101 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 758fca2..78c0695 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -10,15 +10,14 @@ </component> <component name="ChangeListManager"> <list default="true" id="43aff179-c306-46b9-b69f-eca5306fbf96" name="Default Changelist" comment=""> - <change beforePath="$PROJECT_DIR$/Box" beforeDir="false" /> + <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Box.c" beforeDir="false" afterPath="$PROJECT_DIR$/Box.c" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/Box.h" beforeDir="false" afterPath="$PROJECT_DIR$/Box.h" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/Box.o" beforeDir="false" afterPath="$PROJECT_DIR$/Box.o" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/Vector" beforeDir="false" /> + <change beforePath="$PROJECT_DIR$/Star.c" beforeDir="false" afterPath="$PROJECT_DIR$/Star.c" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/Star.o" beforeDir="false" afterPath="$PROJECT_DIR$/Star.o" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Vector.c" beforeDir="false" afterPath="$PROJECT_DIR$/Vector.c" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Vector.h" beforeDir="false" afterPath="$PROJECT_DIR$/Vector.h" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Vector.o" beforeDir="false" afterPath="$PROJECT_DIR$/Vector.o" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/makefile" beforeDir="false" afterPath="$PROJECT_DIR$/makefile" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/galaxy_simulation" beforeDir="false" /> </list> <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> <option name="SHOW_DIALOG" value="false" /> @@ -27,12 +26,12 @@ <option name="LAST_RESOLUTION" value="IGNORE" /> </component> <component name="FileEditorManager"> - <leaf> - <file pinned="false" current-in-tab="false"> + <leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> + <file pinned="false" current-in-tab="true"> <entry file="file://$PROJECT_DIR$/Vector.c"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="2159"> - <caret line="208" column="1" selection-start-line="208" selection-start-column="1" selection-end-line="208" selection-end-column="1" /> + <state relative-caret-position="427"> + <caret line="39" column="18" selection-start-line="39" selection-start-column="18" selection-end-line="39" selection-end-column="18" /> </state> </provider> </entry> @@ -40,8 +39,8 @@ <file pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/Vector.h"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="442"> - <caret line="26" lean-forward="true" selection-start-line="26" selection-end-line="26" /> + <state relative-caret-position="153"> + <caret line="9" column="53" selection-start-line="9" selection-start-column="53" selection-end-line="9" selection-end-column="53" /> </state> </provider> </entry> @@ -49,8 +48,8 @@ <file pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/Box.c"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="68"> - <caret line="4" selection-start-line="4" selection-end-line="4" /> + <state relative-caret-position="597"> + <caret line="82" selection-start-line="82" selection-end-line="82" /> </state> </provider> </entry> @@ -64,11 +63,11 @@ </provider> </entry> </file> - <file pinned="false" current-in-tab="true"> + <file pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/Star.c"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="255"> - <caret line="15" column="14" selection-start-line="15" selection-start-column="14" selection-end-line="15" selection-end-column="14" /> + <state relative-caret-position="291"> + <caret line="75" column="79" selection-start-line="75" selection-start-column="79" selection-end-line="75" selection-end-column="79" /> </state> </provider> </entry> @@ -76,8 +75,8 @@ <file pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/Star.h"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="442"> - <caret line="26" selection-start-line="26" selection-end-line="26" selection-end-column="36" /> + <state relative-caret-position="323"> + <caret line="19" selection-start-line="19" selection-end-line="22" selection-end-column="44" /> </state> </provider> </entry> @@ -94,8 +93,8 @@ <file pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/makefile"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="34"> - <caret line="2" column="20" selection-start-line="2" selection-start-column="20" selection-end-line="2" selection-end-column="41" /> + <state relative-caret-position="153"> + <caret line="9" column="31" selection-start-line="9" selection-start-column="31" selection-end-line="9" selection-end-column="31" /> </state> </provider> </entry> @@ -115,20 +114,20 @@ <list> <option value="$PROJECT_DIR$/Vector_Test.h" /> <option value="$PROJECT_DIR$/Vector_Test.c" /> - <option value="$PROJECT_DIR$/Vector.h" /> - <option value="$PROJECT_DIR$/Vector.c" /> - <option value="$PROJECT_DIR$/makefile" /> - <option value="$PROJECT_DIR$/Box.c" /> <option value="$PROJECT_DIR$/Box.h" /> <option value="$PROJECT_DIR$/galaxy_simulation.c" /> <option value="$PROJECT_DIR$/Star.h" /> + <option value="$PROJECT_DIR$/Box.c" /> + <option value="$PROJECT_DIR$/makefile" /> + <option value="$PROJECT_DIR$/Vector.h" /> <option value="$PROJECT_DIR$/Star.c" /> + <option value="$PROJECT_DIR$/Vector.c" /> </list> </option> </component> <component name="ProjectFrameBounds" extendedState="6"> - <option name="x" value="761" /> - <option name="y" value="53" /> + <option name="x" value="760" /> + <option name="y" value="52" /> <option name="width" value="1050" /> <option name="height" value="730" /> </component> @@ -155,6 +154,7 @@ <property name="WebServerToolWindowFactoryState" value="false" /> <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" /> <property name="nodejs_npm_path_reset_for_default_project" value="true" /> + <property name="nodejs_package_manager_path" value="npm" /> </component> <component name="RunDashboard"> <option name="ruleStates"> @@ -178,24 +178,21 @@ <option name="number" value="Default" /> <option name="presentableId" value="Default" /> <updated>1559227081243</updated> - <workItem from="1559227084365" duration="44894000" /> + <workItem from="1559227084365" duration="53793000" /> + <workItem from="1560336527698" duration="9022000" /> </task> <servers /> </component> <component name="TimeTrackingManager"> - <option name="totallyTimeSpent" value="44894000" /> + <option name="totallyTimeSpent" value="62815000" /> </component> <component name="ToolWindowManager"> <frame x="-7" y="-7" width="1550" height="838" extended-state="6" /> <editor active="true" /> <layout> - <window_info id="Favorites" side_tool="true" /> - <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.24966443" /> + <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.25302014" /> <window_info id="Structure" order="1" side_tool="true" weight="0.25" /> - <window_info anchor="bottom" id="Database Changes" /> - <window_info anchor="bottom" id="Version Control" /> - <window_info anchor="bottom" id="Terminal" /> - <window_info anchor="bottom" id="Event Log" side_tool="true" /> + <window_info id="Favorites" order="2" side_tool="true" /> <window_info anchor="bottom" id="Message" order="0" /> <window_info anchor="bottom" id="Find" order="1" /> <window_info anchor="bottom" id="Run" order="2" /> @@ -203,10 +200,14 @@ <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" /> <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" /> <window_info anchor="bottom" id="TODO" order="6" /> - <window_info anchor="right" id="Database" /> + <window_info anchor="bottom" id="Database Changes" order="7" /> + <window_info anchor="bottom" id="Version Control" order="8" /> + <window_info anchor="bottom" id="Terminal" order="9" /> + <window_info anchor="bottom" id="Event Log" order="10" side_tool="true" /> <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" /> <window_info anchor="right" id="Ant Build" order="1" weight="0.25" /> <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" /> + <window_info anchor="right" id="Database" order="3" /> </layout> </component> <component name="TypeScriptGeneratedFilesManager"> @@ -225,51 +226,46 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/Vector_Test.h"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="17"> - <caret line="1" column="17" selection-start-line="1" selection-start-column="17" selection-end-line="1" selection-end-column="17" /> - </state> - </provider> + <entry file="file://$PROJECT_DIR$/Vector_Test.h" /> + <entry file="file://$PROJECT_DIR$/Vector_Test.c" /> + <entry file="file://$PROJECT_DIR$/Vector.o"> + <provider selected="true" editor-type-id="text-editor" /> </entry> - <entry file="file://$PROJECT_DIR$/Vector_Test.c"> + <entry file="file://$PROJECT_DIR$/makefile"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="243"> - <caret line="21" column="1" lean-forward="true" selection-start-line="5" selection-end-line="21" selection-end-column="1" /> + <state relative-caret-position="153"> + <caret line="9" column="31" selection-start-line="9" selection-start-column="31" selection-end-line="9" selection-end-column="31" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/Vector.o"> - <provider selected="true" editor-type-id="text-editor" /> - </entry> <entry file="file://$PROJECT_DIR$/../C/Projet/makefile"> <provider selected="true" editor-type-id="text-editor" /> </entry> - <entry file="file://$PROJECT_DIR$/Vector.h"> + <entry file="file://$PROJECT_DIR$/Box.c"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="442"> - <caret line="26" lean-forward="true" selection-start-line="26" selection-end-line="26" /> + <state relative-caret-position="597"> + <caret line="82" selection-start-line="82" selection-end-line="82" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/Box.c"> + <entry file="file://$PROJECT_DIR$/Box.h"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="68"> - <caret line="4" selection-start-line="4" selection-end-line="4" /> + <state> + <caret column="19" selection-start-column="19" selection-end-column="19" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/makefile"> + <entry file="file://$PROJECT_DIR$/Star.h"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="34"> - <caret line="2" column="20" selection-start-line="2" selection-start-column="20" selection-end-line="2" selection-end-column="41" /> + <state relative-caret-position="323"> + <caret line="19" selection-start-line="19" selection-end-line="22" selection-end-column="44" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/Star.h"> + <entry file="file://$PROJECT_DIR$/Vector.h"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="442"> - <caret line="26" selection-start-line="26" selection-end-line="26" selection-end-column="36" /> + <state relative-caret-position="153"> + <caret line="9" column="53" selection-start-line="9" selection-start-column="53" selection-end-line="9" selection-end-column="53" /> </state> </provider> </entry> @@ -280,24 +276,17 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/Vector.c"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="2159"> - <caret line="208" column="1" selection-start-line="208" selection-start-column="1" selection-end-line="208" selection-end-column="1" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/Box.h"> + <entry file="file://$PROJECT_DIR$/Star.c"> <provider selected="true" editor-type-id="text-editor"> - <state> - <caret column="19" selection-start-column="19" selection-end-column="19" /> + <state relative-caret-position="291"> + <caret line="75" column="79" selection-start-line="75" selection-start-column="79" selection-end-line="75" selection-end-column="79" /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/Star.c"> + <entry file="file://$PROJECT_DIR$/Vector.c"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="255"> - <caret line="15" column="14" selection-start-line="15" selection-start-column="14" selection-end-line="15" selection-end-column="14" /> + <state relative-caret-position="427"> + <caret line="39" column="18" selection-start-line="39" selection-start-column="18" selection-end-line="39" selection-end-column="18" /> </state> </provider> </entry> diff --git a/Box.c b/Box.c index 950e968..7e3ea03 100644 --- a/Box.c +++ b/Box.c @@ -79,6 +79,8 @@ void print_box(box b){ } + + //TEST FONCTIONS// int Test_new_box(){ diff --git a/Star.c b/Star.c index a108113..8c892bc 100644 --- a/Star.c +++ b/Star.c @@ -4,55 +4,143 @@ #include <math.h> #include "Star.h" +double norme(const vec const v1){ + + //La norme correspond a la racine carré de (x^2 + y^2), ici on fait puissance 1/2 qui est équivalent à racine carrée + double norm = pow((pow(v1.x,2.0) + pow(v1.y,2.0)),0.5); + + return norm; + +} + void print_star(const star *const s){ - printf("POSITION:"); - printf(" "); - printf("VITESSE:"); - printf(" "); - printf("ACCELERATION:"); - printf(" "); - printf("MASSE"); + + vec *p = new_vec(s->pos_t.x,s->pos_t.y); + vec *v = new_vec(s->pos_t_dt.x,s->pos_t_dt.y); + vec *a = new_vec(s->acc.x,s->acc.y); + printf("POSITION:\n"); + print_vec(p); + printf("\n"); + printf("VITESSE:\n"); + print_vec(v); + printf("\n"); + printf("ACCELERATION:\n"); + print_vec(a); + printf("\n"); + printf("MASSE:\n"); + printf("%f",s->mass); printf("\n"); - print_vec(s->pos_t); - printf(" "); - print_vec(s->pos_t_dt); - printf(" "); - print_vec(s->acc); - printf(" "); - printf("%f",s->mass) + free(p); + free(v); + free(a); } star *new_star_vel(vec pos, vec vel, vec acc, double mass,double dt){ - star new_star; - new_star.mass = mass; - new_star.pos_t = pos; - new_star.pos_t_dt = sub_vec(pos,mul_vec(dt,vel)); - new_star.acc = acc; + star *new_star = malloc(sizeof(star)); + new_star->mass = mass; + new_star->pos_t = pos; + vec *pos_t_dt = sub_vec(&pos,mul_vec(dt,&vel)); + new_star->pos_t_dt.x = pos_t_dt->x; + new_star->pos_t_dt.y = pos_t_dt->y; + new_star->acc = acc; + + return new_star; + +} + +void reset_acceleration(star *s){ + + s->acc.y = 0.0; + s->acc.x = 0.0; + +} + +void update_acceleration(star *s, const star *const s2) { + + double G = 6.67e-11; + vec sub = sub_vect(s2->pos_t,s->pos_t); + vec F = mul_vect(G * s->mass * s2->mass, sub); + double n = pow(norme(sub),3); + + F = mul_vect(1/n,F); + print_vect(F); + + s->acc = mul_vect(1/s->mass,F); +} - print_star(new_star); +void update_position(star *s, double dt){ + s->pos_t = add_vect(sub_vect(mul_vect(2,s->pos_t),s->pos_t),mul_vect(dt*dt,s->acc)); } +//pos_t = 2*pos_t - pos_t_dt + acc * dt * dt + + + //TEST FONCTIONS// int Test_new_star(){ - vec *p = new_vec(1.0,4.0); - vec *v = new_vec(2.0,0.5); - vec *a = new_vec(1.0,1.0); + vec p = (vec){1.0,4.0}; + vec v = (vec){2.0,0.5}; + vec a = (vec){1.0,1.0}; - star star_test = new_star_vel(p,v,a,1000.0,3.0); + star *star_test = new_star_vel(p,v,a,1000.0,3.0); - free(p); - free(v); - free(a); + if(star_test->pos_t_dt.x == -5.0 && star_test->pos_t_dt.y ==2.5){ + + printf("Test_new_star IS OK\n"); + } + else{ + printf("Test_new_star has an ERROR\n"); + } + + free(star_test); + +} + +int Test_reset_acc(){ + + vec p = (vec){1.0,4.0}; + vec v = (vec){2.0,0.5}; + vec a = (vec){1.0,1.0}; + + star *star_test = new_star_vel(p,v,a,1000.0,0.0); + + reset_acceleration(star_test); + + if(star_test->acc.x == 0.0 && star_test->acc.y == 0.0){ + printf("Test_reset_acc IS OK\n"); + + } + else{ + printf("Test_reset_acc has an ERROR\n"); + } + free(star_test); +} + +int Test_update_acc(){ + + vec terre = (vec){0.0,0.0}; + vec v = (vec){2.0,0.5}; + vec a = (vec){1.0,1.0}; + + vec lune = (vec){0.0,384400000.0}; + + star *star1 = new_star_vel(terre,v,a,5.9722e24,0.0); + star *star2 = new_star_vel(lune,v,a,7.342e22,0.0); + + update_acceleration(star2,star1); + free(star1); + free(star2); } int star_tests(){ Test_new_star(); - + Test_reset_acc(); + Test_update_acc(); } \ No newline at end of file diff --git a/Star.o b/Star.o index faeb85e750266003160f8fc25d893d4a037c52bf..2a406ff12991be4950d2e3a751e3ce589c8a9387 100644 GIT binary patch literal 7576 zcmb<-^>JfjWMqH=Mg}_u1P><4zz`vYU^{@B4h*~uJPe^8oliZQ-x#EM@Yfwo<JUO2 z10=Z%M0j+b0Er&*=yZMH(HZ)}qucetCw>7|kX#zS#tDy3*BhVs1zc~u0Ev9!7j(Vh z(e3&IP00n2k_%8J5nvs>AoXAokogBZI$eK&6#Y1P80H#}&RURJAmbf4Ji0*!GeE6G zG7qE?B>9P7z(E4U@aT3Bz^d#6NEW0_1H|y?c2K~o?1e|KE!=G$-L5}8I*)_hxu1)H zfdR}yQ}KbIiWdY`-0<jjF!1Pfh4>6=!46O)f^9^y8_7i;-L7!EL7@(_Wdb}96F`AW zAWGBtHBP1RYaB*II!F^d+Anx?hTcfy*Eo~LuW=NIngbr4p(j4^3zqKq#4lL8VZQ}D zq&i)HfWi<IwIDeM1CMTBkjMj%?$8$=os1rxfgB#ap%*;5T{n1iUiav9T>(<N0_<y# z&O;u(pmcW)<};5@S5P#5_{1;305Mn4K>!pCpm+r(k{_S=1wrWmY{>zS?$8q+osJ3~ zoq?c8hb6AgT96Zdr18H$08$Q?f^ifk#DY^`ut)Qo2#?O%9Uh&f8(_&9l)gb(V8<tZ z0Rfnm8$7x}Y!8k!evKO*ouNn`00ra$P=<oUEF^P)G&>l4;*WF%83i)i1H?P{iC@4M z6#b!)yo9V5<V@ES9^K&N;d=u$l+yS$K-%D0GL2v35IFe2CV(<7!ufIF-0OSb6Td*{ z34|i36XDi?<b6ST8_6#o-L4>)gWL+q{-5~c4tjLQf&_6G=&bOGU(i`&f=Ba_h-gT# zI)*xifPz*7l)FK}3358fTam7yGyux%9txlM1p+isUFWz5lqVhcf=JKKBWa%ebw@$j z_!GYX2Q(sJ0dT>i(-q_a*8^}PaOHq*Uyy~IpZEnFIY7EV$vBNaKNJ*ak32d<LB`~Q zI2S>2o5rtkB#mF=EMa3~Z}@bk9`NbRJ(0$r?|Q(e^O;ZQdr&-ibk>5*j0Kf<;7kLS zhuY+ea4^WugC3pCpzz}Wg`Y;WV~k@gBn&;8-vl6{R1h4cV9$fX6JGR!IH16V%YeKJ z=YU)R=bZS&FJKA^*-!iex==b5q#_n16ACf~RQiG~@_muUukkO9U*l^Uzs74&uy}NW z6Nc*!aJWFrV^CoZDu?yJmQ<Oh@k3ap+K_B3;2;4Ls)Dmh`Je?K*reAy$UKlXSSf%g z->4rB#Q6XHf5QHUxfSGYPy$s*<9~lLjbHB|C@df>L|ACRB_&`i(!(MFT7<bifHBBQ z3oy-~f(aaXpo9d<<Ya{masdLV;_(>+veS1*8b3w=qZ;$UqdOE-f`9PnMAQs8>P2W; z0ask$WQC12A@(pR*$4Osdxm)W`&luBd4{+K2fJD^I66DK`nU!;LWF%C!Gfx33?Zq- zCGmNw<?+QOiA4&Y!3zG~Xkr<O#R`de3a&vx{y`9_qSWHllK8~rWMuUSK@<%j=fE(e zsmAcY{^QNu#2KNNz|9i|1`eqB2YZM@0SMorA3`&T9Ds<kfcOnnFSj`=Dkc>!J0$FC z9yTM!Ok%wYgS)e{m4b##YEoumo`RX4v7Ujhp@nuzYLaECp(aE?!N|bS+`!b(jDdkc z1Y#fqV^t6XV}$^tG!Hw+1V#o183qUjN%w&WM?QfzCTCtYrcNGq4v3r$NSuLz!4=e| zfypyFFoG0-^v6KuB~avr;qo<5c~uY%)1Ls+&A_0*z`!sEB+kIV5RR<hwV9dO7i<KB z3IhWJG(Z?!kkxqhGWW1Fvof1O)PdXrPA3cu3>?Vnn3=%}K=NR51_lNm6nS>Iyaq^| zfq_8*M8n+5EDe?ixzz(C&cMKc%`Z@IV5LCXSQtM3$0o^)wZ+fCz|6pmO*sQI0}Bpu zaHhwQV`gB-5CaJ?GjM<?49v{Hh9L%0DTL%sa9UwtVBlk5U=YAi%>a%wY~mUW3=AN1 zVEVynih+T_7>7C5IK)921Dp9?IMfH>5Rb$m9tU;jWl+R1Fff4AHUk4gHV*YgIK-=P zh&Msaf6W95JaBqqU|^UE6&HX;JvdJ=FfgpdVa_HT;=6H(AA_2o4oyPf{KUY(a1Dq0 z`%v|(p-Bstf8IjHH$#&OI6pBkF#Lgv?}sKia6W?OH&DFa2PGs}{sDPCxFoSiFPR}P zzbH4AA>Q4`-^tM@-rvnF*fk_R#L>yeHJ+g$znr0<C^N4FTw*hTite)1WQKy$l47Vh zl$)H9SOgJCV@NAXO$93jmGbdrsW}X}i8(p>$qc!rIq@L%#idDL8eWR0=A;%SmSpDV zF_adhB$lLtihG0@RCx(Ze+k4QkP#&?4F&ndnP3AFQ&J!jD0K~5RRZB6>|y}Bv?R5- zq!^MPK*0k_9-yG_0dYWOFq8&GA2%qx|3g3+R2*G>22>nfeJNBNrhW>P4@$2fCc1iX z)yu#DE_p!x|346G|AW#8Og*wV8#Ld5%t00xgo?xLg_$D;6$hyYl_@ZBB_wfvB>(Cl ziG#`kn0jNVILv%#@?@}pildtkOaCBoWb^%y)FYc83KfT$57Gnje-u<4WDc_X(~!hL zYGLjyKoUnbzZ@zKGhY^DI0FMi4OAT6{3%dzn0ioM3DPnTDh^UFh!k!ski?Pg-GU@8 zgrxoe4)HTM#KS-ifu<8sn*-+GDM;d?Naim?5*I@fSA~{;AZbwghqVzxq2eHaNg}DA zh$IdgDuda(3n~sWhZ9NtF(h%2`Aa~7#=yXE87dAkA31+Lfr^970jXaDRsRDj4pNV7 zuOdhQ8V=G(_8LLO(arIMii0R*bEbg=pynWpABT#=%z>2;H=*Jn3R%4Y$k9-9ki)GD zNgR~cVBxkMDh@Lr=HDY|;#;8Ma1l)$=AL_K;;?e&HJUig{2w^PS)myj<{nsl@uG=? z#~K(I7(9@~g^|KP7D*gr)e)%s({YGbp^2Y?s&By|-is!#4pl!1Dh`Sl<nm!QR2=3n zP<scYWdT$iUHuv)apZiuA1V$r2Ns@Z(8OW!brVe-7GKZM#9{IE8BH8!KCEepZZ9vi z{)dUf;{{0^IbI@=#Kn=~YbKI7D869z+&ri_diX4dio@&$wbwx5xdtkZu6_rSIC6O2 zg^I(>frZa2G;vt?d`A<9g%1m~y#q4`CN700eg))61_lOoH1Ru7@gyX1<Z#PF5(kCP z6R7%?NaD!q4<Lz4AcgZ8s5mHmki+2y4)K>zage{{kj(jvBrcC6{ufCc)Q^IdGaxp| z$slt;7{mr)Q2QQ4gTz1>)?Y{f2{JG+fW$x;);@1Q6Nj~{7ods5+SRap4>ALUVeR2J zXzF3@URe7Uq!xr>?Os?r1SAH+uy(Hxw0;DMfiSGy%b-_WnOl;W#GqGPQUswhV639l zoJ75n)QS=Yy_Cd~L<YU2;$jB9qI?J^IX^cyHLrw0FE76&RnOfoRJXV!F*%z-53DUU zBR;JtF*g<Je2OVhynws_&GvBfVDZ8Ns!ZXc3`jjgh#;uW1EnRHdWa|kg9ND20h(ff zrU%f(49FfRmjRR}L2A_)AZ9|VSC9}GyP(+%7KEyWu|c#BXbgY>)Q1M~5SUo~hEOv> zafi^&z~BM3{{ylh)GlNpOQ?PWWI+Z71`Cjf85kJ!(8NJu01|@HPEh?IF=U(u)sHL& zV#D--*dQDZ)sOD}45<DLG!3xu2k8Z2P=6U){4szU4-5<pF#m&$1L*}}kUm)afs9AD z8zg@L)Tm-$U@(A2EQkvVQgr<wF{l!dHUtJWq8S(%#6cDyL^0AIsLhK_{|Bi16Or_S Jm}tf^0027aIL`n8 literal 1472 zcmb<-^>JfjWMqH=Mg}_u1P><4z`($aU^{@B4h-B3TnwQeoliZQ-*BXP@Yfwo<JUO2 z10=Z%M0j+b0Er&*=ycuS(HXiUjbGzb8o$P2gbI)}T+ITH&d?QU{2FJ{_%)8=P&2`! zGjzr$e!<d?PyB+l4WIZ0TtO_?4<6mF8$7y0cX)KV9`NW4Ju%_rVUWuv#2#jFcXqZ? z&~Qmj%1q2tFw-;EGtf1(&`wEBvMe>!ga{}Y85o)ym>QZfFo=L$&cMLHSQW&;SRueD z&BM+yfsuhhh5>>>(z8H>BcDJUlQS<H(^MXI4v3r$NSuLzfgMD{<ek9MAQ7w>6xJ*Z zAOB;MWX2v749pBn*pxFcBS#XF3T6gYBp!mv%)o}=AhDPkSde%SCI<rpgAkH?z+u3^ zz#s}0hw;IF2Wbf|Ni5P!X2?q|k1sAsEQ&8n&0zpDN>YnUiWw9@Y8V*6K0)>kByAzY zVdgUE6<6k#BqlNF6_*r2=nNREB(<W1K`$k-B#}WcskoRyFF8LqH#M(>K`$@ABvsGd zFI2a<Br!RgL9Zw^Cs8joBR;JtF*g<J0?H_9P+DPNzz9j0KNg}H4~lPOAw{Tur0fNj zeh4Np33UDH3=9mQxFJ`+4%B`FG^=3t>!FFm?1#~&Q2l7i82Did&?L}>y`cJ$(*Q_| z090WFh=YVdensLkxH2$+Q!6aIVR98v17ZFG=>w&95Diiz0U~hN4U)=$+W!H>VPIh3 vgoZP^evmkN*n_l0K<$U6bC4JaLyZM7!B`NrXa$Rbh!s%%As`MCM%NDjra*>F diff --git a/Vector.c b/Vector.c index 984aded..14cbd38 100644 --- a/Vector.c +++ b/Vector.c @@ -34,6 +34,18 @@ vec *add_vec(const vec *const v1, const vec *const v2){ } +vec add_vect(const vec const v1, const vec const v2){ + + //Création d'un vecteur nul + vec add_vec = (vec){0.0,0.0}; + //Addition des x et des y faite dans le nouveau vecteur + add_vec.x = v1.x + v2.x; + add_vec.y = v1.y + v2.y; + + return add_vec; + +} + vec *sub_vec(const vec *const v1, const vec *const v2){ //Création d'un vecteur nul @@ -46,6 +58,18 @@ vec *sub_vec(const vec *const v1, const vec *const v2){ } +vec sub_vect(const vec const v1, const vec const v2){ + + //Création d'un vecteur nul + vec sub_vec = (vec){0.0,0.0}; + //Soustraction des x et des y dans le nouveau vecteur + sub_vec.x = v1.x - v2.x; + sub_vec.y = v1.y - v2.y; + + return sub_vec; + +} + vec *mul_vec(double alpha, const vec *const v2) { //Création d'un vecteur nul vec *mul_vec = new_vec(0.0,0.0); @@ -57,6 +81,17 @@ vec *mul_vec(double alpha, const vec *const v2) { } +vec mul_vect(double alpha, const vec const v2) { + //Création d'un vecteur nul + vec mul_vec =(vec){0.0,0.0}; + //Multiplication du x et du y par le scalaire dans le nouveau vecteur + mul_vec.x = alpha * v2.x; + mul_vec.y = alpha * v2.y; + + return mul_vec; + +} + double norm(const vec *const v1){ //La norme correspond a la racine carré de (x^2 + y^2), ici on fait puissance 1/2 qui est équivalent à racine carrée @@ -66,6 +101,7 @@ double norm(const vec *const v1){ } + double distance(const vec *const v1, const vec *const v2){ //La distance correspond à la racine carré de (x2 - x1)^2 + (y2 -y1)^2 @@ -81,7 +117,16 @@ void print_vec(const vec *const v){ printf("}\n"); printf("{"); printf("%f",v->y); + printf("}"); +} + +void print_vect(const vec const v){ + printf("{"); + printf("%f",v.x); printf("}\n"); + printf("{"); + printf("%f",v.y); + printf("}"); } diff --git a/Vector.h b/Vector.h index fa618bd..2079c67 100644 --- a/Vector.h +++ b/Vector.h @@ -2,25 +2,30 @@ typedef struct vec { double x, y; } vec; -//Créé et initialiser un vecteur: +//Créer et initialiser un vecteur: vec *new_vec(double x, double y); //Additionne deux vecteurs vec *add_vec(const vec *const v1, const vec *const v2); +vec add_vect(const vec const v1, const vec const v2); //Soustrait deux vecteurs vec *sub_vec(const vec *const v1, const vec *const v2); +vec sub_vect(const vec const v1, const vec const v2); //Multiplie un vecteur par un scalaire vec *mul_vec(double alpha, const vec *const v2); +vec mul_vect(double alpha, const vec const v2); //Calcule la norme d’un vecteur double norm(const vec *const v1); +double norme(const vec const v1); //Calcule la distance entre deux vecteurs double distance(const vec *const v1, const vec *const v2); //Affiche un vecteur void print_vec(const vec *const v); +void print_vect(const vec const v); int vector_tests(); diff --git a/Vector.o b/Vector.o index 5809106742ed6108b09675bd4eef663470eaea3b..1d169814ec132196c3f1ebd784a80ce7658c9ace 100644 GIT binary patch literal 9024 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 HVRZcfS?gFT literal 7880 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 G$U*>Oy8Dg* diff --git a/galaxy_simulation b/galaxy_simulation index 25d1690ed1c11ac31335eb8c705957bea20b9113..65dc84f9d90ffd9e0acf082706742b9f5719ec82 100644 GIT binary patch literal 22736 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 delta 6677 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 -- GitLab