¡Calcula la distancia entre dos líneas paralelas incluyendo ! - página 7

 
Олег avtomat:

como quieras.

Como puedes ver, no hay nada complicado. Sólo hay que pensarlo un poco.

Con una respuesta tan detallada, creo que TC será capaz de escribir el código por sí mismo.

Muchas personas aquí ya han olvidado los problemas escolares porque no pudieron comprender su significado en la escuela.

 

La salida es:

 // ЗАДАЕМ ДВЕ ТОЧКИ ПРИВЯЗКИ ДЛЯ ГЛАВНОЙ ЛИНИИ: ТОЧКА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. ОПТИМАЛЬНЫМ И УНИВЕРСАЛЬНЫМ ПАРАМЕТРОМ РАЗМЕРА НАВЕРНОЕ БУДУТ - ПИКСЕЛИ.

A continuación, mediante ObjectGetValueByShift("Línea1",a++) y ObjectGetValueByShift("Valor",a++) y ObjectGetValueByShift("Línea2",a++) se busca la intersección

¿Estoy leyendo bien?
 
Олег avtomat:

Para resolver el problema hay que:

1. dibujar una perpendicular a las líneas paralelas dadas

2. determinar los puntos de intersección de la perpendicular con las líneas dadas

3. calcular la distancia entre los puntos de intersección


Claramente en imágenes:

(diferentes líneas y distancias entre ellas)



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


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


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


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


No es convincente.

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

No es convincente.

Abra sus libros de texto y convénzase

 
La teoría parece estar clara y no parece haber nada complicado pero... Lo único es cómo hacerlo en la práctica y cómo funcionará...
 
Itum:

Por desgracia, no soy matemático (
¿Qué tal si lo buscas en Google?


ángulo azul = 90 - ángulo de la línea

convertir un ángulo en radianes

cateto opuesto rojo = hipotenusa verde * seno (ángulo azul)

Ya hemos encontrado la hipotenusa en este hilo cruzando ambas líneas verticalmente

Si el ángulo de la línea es de 90 o 0, entonces considere la distancia de manera diferente, es decir, cruzando líneas paralelas horizontal o verticalmente.

 
Renat Akhtyamov:
¿Qué tal si lo buscas en Google?


ángulo azul = 90 - ángulo de la línea

Convertir un ángulo en radianes

cateto opuesto rojo = hipotenusa verde * seno (ángulo azul)

Ya encontramos la hipotenusa en este hilo cruzando ambas líneas verticalmente

Si el ángulo de la línea es de 90 o 0, entonces cuenta la distancia de otra manera, es decir, cruzando líneas paralelas horizontal o verticalmente.

Hmmm...

Por alguna razón no funciona

   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 /* */);
 
Parece sencillo... Pero no obtiene el resultado que desea
 
Itum:
Parece sencillo... pero no obtiene el resultado que desea


Sí, todo es sencillo, excepto que su tarea no es solucionable.... ))

En primer lugar, olvídese de la funciónObjectGetDouble(0,"Line1",OBJPROP_ANGLE), que siempre devolverá 0, ya que no se puede aplicar a una línea de tendencia. Es necesario, en particular, para la línea de tendencia "angular", que no depende de la escala del gráfico PERO tampoco depende de los precios de las barras. Es decir, su ángulo no cambiará al cambiar la escala, pero la propia línea se alejará de las barras...


Pero ese no es el mayor problema... La cuestión es que quieres encontrar el tamaño de la perpendicular entre 2 líneas de tendencia paralelas, intenta dibujar dicha perpendicular en el gráfico... Y luego cambia la escala del gráfico... la perpendicular se convierte en no perpendicular... )))) Así que el problema es exactamente lo que tú consideras una perpendicular (depende de la escala y de cómo la veas TÚ) y una perpendicular matemática.

La perpendicular en un gráfico de escala de precios es una ilusión óptica.

Utilizando la geometría este problema en su forma pura se resuelve de una sola vez... PERO el resultado matemático del cálculo nunca coincidirá con el que se ve en el gráfico... Y se necesita exactamente la coincidencia, por lo que el problema es irresoluble. Simplifique sus requisitos, no busque la perpendicular, sino simplemente la distancia entre 2 líneas en el mismo punto temporal...

 

No tengo palabras.

Conozco todas las letras, pero no puedo leer la palabra

Vamos, vamos, no te rindas, estudia MQL, es sólo cuestión de tiempo