Rysowanie wielokolorowego prostokąta z zaokrąglonymi rogami

0

Hej.

Chce narysować na panelu/formie wielokolorowy prostokąt z zaokrąglonymi rogami.

Do tej pory ten element był "kanciasty" i nie było z tym problemu.
Mam prostokąt o określonych wymiarach, dostaje tablice wartości i kolorów, na podstawie wartości obliczam jaki to procent tego pierwotnego prostokąta i na nim rysuje kolejne prostokąty w podanych kolorach.
Otrzymuje coś takiego:
screenshot-20230403141910.png

Nie mam pomysłu jak zaokrąglić rogi biorąc pod uwagę że pierwszy i ostatni element może mieć bardzo małą szerokość.

Podpowiecie coś?

0

nabazgrane w paincie ale powinieneś wiedzieć o co chodzi - dwa skrajne jako roundedrect + po wewnętrznych stronach dodatkowy prostokąt bez zaokrągleń
screenshot-20230403225404.png
Inna opcja to bawić się ścieżkami :) ale wydaje mi się, że dodatkowe dwa prostokąty będą prostsze

0

Rysuj zupełnie tak samo jak poprzednio, ale z dodatkowo nałożoną maską zaokrąglonego prostokąta.

0

@abrakadaber: problem pojawia się gdy pierwszy lub ostatni element ma małą szerokość (np 1 lub 2) - wtedy zaokrąglenie się "nie zmieści".

@Spearhead: w jaki sposób nakłada się maskę?

2

Nigdy nie implementowałem rounded rectangles, zawsze funkcje rysowania prostokątów to udostępniały jako jeden z parametrów funkcji, nigdy nie patrzyłem na matematyczny algorytm tego, więc akurat nie implementowałem tego wewnętrznie.

Dosyć ciekawe zagadnienie, ale nie zdążę tego sprawdzić, ale jak ty potrzebujesz pewnie to zrobisz.

Dam ci z dwa linki, wydaje się, że dość ciekawe.
https://www.toptal.com/c-plus-plus/rounded-corners-bezier-curves-qpainter
https://mathworld.wolfram.com/RoundedRectangle.html

0

@Spearhead: w jaki sposób nakłada się maskę?

Pytanie podobne do "jak się rysuje prostokąt". Albo używasz API co masz albo jakiejś biblioteki co robi to za ciebie albo piszesz kod samemu. Z grubsza mówiąc iterujesz sobie po pikselach prostokąta i dla każdego sprawdzasz, czy jego pozycja na masce to 0xFFFFFF czy 0x000000 i w zależności od tego rysujesz bądź nie. Na koniec zaś pewnie trzeba dorzucić jakiś antialiasing, bo inaczej krawędzie będą biły po oczach.

0

z maską jest ten problem, że jak będziesz chciał dodać ramkę to cały misterny plan w pizdu. A może zamiast bawić się w kilka prostokątów to da się to załatwić odpowiednio spreparowanym brushem?

0
abrakadaber napisał(a):

z maską jest ten problem, że jak będziesz chciał dodać ramkę to cały misterny plan w pizdu. A może zamiast bawić się w kilka prostokątów to da się to załatwić odpowiednio spreparowanym brushem?

Da się też załatwić shaderem, który dostanie tablicę wartości i kolorów. A maska w teksturze. Ramka w drugiej, jak bardzo chcesz :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1