• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Rysowanie odcinka react

Object Storage Arubacloud
+1 głos
222 wizyt
pytanie zadane 21 czerwca 2021 w JavaScript przez poldeeek Mądrala (5,980 p.)
zamknięte 22 czerwca 2021 przez poldeeek

Napisałem komponent, który powinien rysować odcinek między dwoma punktami. Nie wiem jednak czemu program się sypie dla minusowych kątów -0deg do -90deg. Dla dodatnich wygląda to ładnie.
Wydaje mi się, że problemem może być 

        transformOrigin: `${degrees > 0 ? '0% 0%' : '100% 100%'}`

jednak nie potrafię dobrze wyczuć jak dokładnie działa ta właściwość w moim przypadku..

"Punkty" mają wielkość 150px, dlatego w kodzie są wyśrodkowania typu left: (x1 + 75).toString() + 'px'
Funkcja rysująca odcinki wygląda tak:

  useEffect(() => {
    let x1 = spider1.y;
    let y1 = spider1.x;
    let x2 = spider2.y;
    let y2 = spider2.x;

    if (x1 > x2) {
      let xTmp = x1;
      let yTmp = y1;
      x1 = x2;
      y1 = y2;
      x2 = xTmp;
      y2 = yTmp;
    }
    if (x1 === x2) {
      const height = Math.abs(y2 - y1).toString();
      setStyle({
        width: '5px',
        left: (x1 + 75).toString() + 'px',
        top: `${Math.min(y1, y2) + 75}px`,
        height: `${height}px`,
        transform: 'rotate(0deg)'
      });
    } else {
      const a = (y2 - y1) / (x2 - x1);
      const radians = Math.atan(a);
      const degrees = radians * (180 / Math.PI);

      setStyle({
        width: `${Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))}px`,
        left: (x1 + 75).toString() + 'px',
        top: `${Math.min(y1, y2) + 75}px`,
        height: `5px`,
        transform: `rotate(${degrees}deg)`,
        transformOrigin: `${degrees > 0 ? '0% 0%' : '100% 100%'}`
      });
    }
  }, [spider1, spider2]);

  return <div className='net' style={style} ref={myRef}></div>;

 

Dla dopełnienia w klasie net mam:
 

.net {
  position: absolute;
  background-color: red;
  z-index: 90;
}

 

komentarz zamknięcia: Rozwiązane
komentarz 21 czerwca 2021 przez ScriptyChris Mędrzec (190,190 p.)

Co konkretnie się źle wyświetla dla tych minusowych wartości? Możesz pokazać screena dla dodatniego i ujemnego kąta?

W devtoolsach przeglądarki możesz się pobawić property transform-origin i jeśli problem będzie ten sam, to to nie jest problem Reacta (czy JS-a), ale CSS-a.

1
komentarz 21 czerwca 2021 przez poldeeek Mądrala (5,980 p.)
edycja 21 czerwca 2021 przez poldeeek

Podświetlony w konsoli jest odcinek najbardziej na prawo, który powinien łączyć te 2 divy po prawej stronie.
I dla porównania przesunąłem jednego diva, tak aby było dobrze i po tej operacji ten sam odcinek wskakuje na odpowiedni miejsce:

Słabo widać cokolwiek na tych screenach więc wrzuciłem je na imgbb.com 
https://ibb.co/GRmnWGj
https://ibb.co/nm1X8Dh

1 odpowiedź

+1 głos
odpowiedź 22 czerwca 2021 przez poldeeek Mądrala (5,980 p.)

Problem leżał w linii 32

top: `${Math.min(y1, y2) + 75}px`,

powinno być:

top: `${y1 + 75}px`,

i wartość transform-origin musi zawsze wynosić 

'0% 0%'

Dodatkowo zamiast liczyć wartość kąta funkcją atan() zdecydowałem się na atan2()

const degrees = ((Math.atan2(x1 - x2, y2 - y1) + Math.PI / 2.0) * 180) / Math.PI;

Link do tematu, który stworzyłem na stacku : https://stackoverflow.com/questions/68073911/drawing-a-path-between-points-in-javascript-react-css/68076922#68076922

Podobne pytania

+1 głos
1 odpowiedź 130 wizyt
0 głosów
1 odpowiedź 98 wizyt
pytanie zadane 26 października 2020 w JavaScript przez Bartek12 Mądrala (5,510 p.)
0 głosów
0 odpowiedzi 236 wizyt
pytanie zadane 24 października 2020 w JavaScript przez Nerez Użytkownik (970 p.)

92,571 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...