Calcolare la distanza tra due linee parallele tra cui ! - pagina 7

 
Олег avtomat:

in qualsiasi modo si voglia.

Come potete vedere, non c'è niente di complicato. Bisogna solo pensarci un po'.

Con una risposta così dettagliata, penso che TC sarà in grado di scrivere il codice da solo.

Molte persone qui hanno già dimenticato i problemi scolastici perché non hanno potuto afferrare il loro significato a scuola.

 

L'uscita è:

 // ЗАДАЕМ ДВЕ ТОЧКИ ПРИВЯЗКИ ДЛЯ ГЛАВНОЙ ЛИНИИ: ТОЧКА1(ВРЕМЯ,ЦЕНА) и ТОЧКА2(ВРЕМЯ,ЦЕНА)
   // ЭТА ЛИНИИ ГЛАВНАЯ
   datetime Line1_Врем0=Time[0], Line1_Врем1=Time[10];
   double Line1_Цена0=High[10], Line1_Цена1=Low[10];

   ObjectCreate("Line1",OBJ_TRENDBYANGLE,0,Line1_Врем0,Line1_Цена0,Line1_Врем1,Line1_Цена1);
   ObjectSetInteger(0,"Line1",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Line1",OBJPROP_COLOR,Red);
   ObjectSetInteger(0,"Line1",OBJPROP_WIDTH,2);

   // СТРОИМ ПАРАЛЛЕЛЬНУЮ ЛИНИЮ ТОЛЬКО ПО ОДНОЙ ТОЧКЕ-ПРИВЯЗКЕ
   ObjectCreate("Line2",OBJ_TRENDBYANGLE,0,Time[15],Low[15],0,0);
   ObjectSetInteger(0,"Line2",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,"Line2",OBJPROP_COLOR,Lime);
   ObjectSetInteger(0,"Line2",OBJPROP_WIDTH,2);

  // ПРИСВАИВАЕМ ЛИНИИ Line2 ТАКОЙ ЖЕ САМЫЙ УГОЛ КАК В ЛИНИИ Line1 ЧТО БЫ ЛИНИИ БЫЛИ ПАРАЛЛЕЛЬНЫЕ 
   ObjectSetDouble(0,"Line2",OBJPROP_ANGLE,ObjectGetDouble(0,"Line1",OBJPROP_ANGLE)); 

   // РИСУЕМ ПЕРПЕНДИКУЛЯРНУЮ ЛИНИЮ К Line1 и Line2
   ObjectCreate("Value",OBJ_TRENDBYANGLE,0,Time[0],Low[15],0,0);
   ObjectSetInteger(0,"Value",OBJPROP_RAY,false);
   ObjectSetInteger(0,"Value",OBJPROP_COLOR,Gold);
   ObjectSetInteger(0,"Value",OBJPROP_WIDTH,3);
   ObjectSetDouble(0,"Value",OBJPROP_ANGLE,90+ObjectGetDouble(0,"Line1",OBJPROP_ANGLE));

   // ЗАДАЧА: ПОЛУЧИТЬ РАЗМЕР ЖЕЛТОЙ ЛИНИИ МЕЖДУ Line1 и Line2. ОПТИМАЛЬНЫМ И УНИВЕРСАЛЬНЫМ ПАРАМЕТРОМ РАЗМЕРА НАВЕРНОЕ БУДУТ - ПИКСЕЛИ.

Poi, attraverso ObjectGetValueByShift("Line1",a++) e ObjectGetValueByShift("Value",a++) e ObjectGetValueByShift("Line2",a++) cerca l'intersezione

Sto leggendo bene?
 
Олег avtomat:

Per risolvere il problema è necessario:

1. disegna una perpendicolare alle linee parallele date

2. determinare i punti di intersezione della perpendicolare con le linee date

3. calcolare la distanza tra i punti di intersezione


Chiaramente in immagini:

(linee diverse e distanze tra loro)



.............................................................................


.............................................................................


.............................................................................


.............................................................................


Non convincente.

 
Алексей Тарабанов:

Non convincente.

Aprite i vostri libri di testo e lasciatevi convincere

 
La teoria sembra essere chiara e non sembra esserci nulla di complicato ma... L'unica cosa è come farlo in pratica e come funzionerà...
 
Itum:

Purtroppo non sono un matematico (
Che ne dici di cercarlo su Google?


angolo blu = 90 - angolo della linea

convertire l'angolo in radianti

cateto opposto rosso = ipotenusa verde * seno (angolo blu)

Abbiamo già trovato l'ipotenusa in questo thread incrociando entrambe le linee verticalmente

Se l'angolo della linea è 90 o 0, allora considera la distanza in modo diverso, cioè incrociando linee parallele orizzontalmente o verticalmente.

 
Renat Akhtyamov:
Che ne dici di cercarlo su Google?


angolo blu = 90 - angolo della linea

Convertire l'angolo in radianti

cateto opposto rosso = ipotenusa verde * seno (angolo blu)

Abbiamo già trovato l'ipotenusa in questo thread incrociando entrambe le linee verticalmente

Se l'angolo della linea è 90 o 0, allora conta la distanza in un altro modo, cioè incrociando linee parallele orizzontalmente o verticalmente.

Hmmm...

Per qualche motivo non funziona

   datetime t1 = (datetime)ObjectGetInteger(0, "Line1", OBJPROP_TIME, 0);
   datetime t2 = (datetime)ObjectGetInteger(0, "Line2", OBJPROP_TIME, 0);
   double p1 = 0;
   double p2 = 0;
   
   if(t1 > t2)
   {
      p1 = ObjectGetValueByTime(0, "Line1", t2);
      p2 = ObjectGetDouble(0, "Line2", OBJPROP_PRICE, 0);
   }
   if(t1 < t2)
   {
      p1 = ObjectGetDouble(0, "Line1", OBJPROP_PRICE, 0);
      p2 = ObjectGetValueByTime(0, "Line2", t1);;
   }
   if(t1 == t2)
   {
      p1 = ObjectGetDouble(0, "Line1", OBJPROP_PRICE, 0);
      p2 = ObjectGetDouble(0, "Line2", OBJPROP_PRICE, 0);
   }
   
   double rez = NormalizeDouble(MathAbs(p1 - p2) / _Point, 0) * MathSin(ObjectGetDouble(0,"Line1",OBJPROP_ANGLE));
   Comment("Разница: ", rez /* */);
 
Sembra semplice... Ma non ottiene il risultato desiderato
 
Itum:
Sembra semplice... ma non ottiene il risultato desiderato


Sì, è semplice, tranne che il tuo compito non è risolvibile.... ))

Prima di tutto, dimenticate la funzioneObjectGetDouble(0,"Line1",OBJPROP_ANGLE) che restituirà sempre 0, poiché non può essere applicata a una linea di tendenza. È necessario, in particolare, per la linea di tendenza "angolare", che non dipende dalla scala del grafico MA non dipende nemmeno dai prezzi delle barre. Cioè, il suo angolo non cambierà quando si cambia la scala, ma la linea stessa si allontanerà dalle barre...


Ma questo non è il problema maggiore... Il punto è che vuoi trovare la dimensione della perpendicolare tra 2 linee di tendenza parallele, prova a disegnare una tale perpendicolare sul grafico... E poi cambiare la scala del grafico... la perpendicolare diventa non perpendicolare... )))) Quindi il problema è esattamente quello che tu consideri una perpendicolare (dipendenza dalla scala e da come la vedi tu) e una perpendicolare matematica.

La perpendicolare su un grafico a scala di prezzo è un'illusione ottica.

Usando la geometria questo problema nella sua forma pura si risolve in un colpo solo... MA il risultato matematico del calcolo non coinciderà mai con quello visto sul grafico... E voi volete esattamente la stessa cosa, quindi il problema è irrisolvibile. Basta semplificare i tuoi requisiti, non cercare una perpendicolare, ma solo la distanza tra 2 linee nello stesso punto temporale...

 

Non ho parole.

Conosco tutte le lettere, ma non riesco a leggere la parola

Dai, dai, non mollare, studia MQL, è solo una questione di tempo