Implementace Convex Hull – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Implementace Convex Hull – C / C++ – Fórum – Programujte.comImplementace Convex Hull – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
oxidián0
Grafoman
17. 11. 2022   #1
-
0
-

Dokázal byste někdo provést implementaci Algoritmu Convex Hull jak je načrtnuto v tomto článku? Tak aby to bylo použitelné jako knihovna dll a abych tom mohl použít v Delphi. Mám na PC nainstalováno Visual Studio C++ 2010 a Delphi 7. C/C++ nerozumím. Mé očekávání je: chtěl bych to použít na detekci vnitřní hranice polygonu tvaru, tedy když znám souřadnice bodu uvnitř polygonu. Polygonem je například parcela na které stojí dva věžáky (tvar polygonu kopíruje tvar těch věžáků). Pro mě je uvedený algoritmus abstraktní, vrací se tam nějaký objekt H o kterém nevím co to vlastně je. Kdyby to tedy někdo zvládl, rád bych to použil v aplikaci Delphi voláním knihovny.

Nahlásit jako SPAM
IP: 78.45.195.–
JerryM0
Věrný člen
18. 11. 2022   #2
-
0
-

#1 oxidián
To je zajímavý požadavek. :) A hledáš otroka zdarma na plný úvazek nebo jenom na poloviční ? :)

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:29a1:bc14:51fc:e58d...–
18. 11. 2022   #3
-
0
-

Zadarmo ani kuře nehrabe. Inzerát patří do inzerce.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
18. 11. 2022   #4
-
0
-

#3 hlucheucho
Není to inzerát. Zeptám se tedy jinak. Poradíte mi někdo jak implementovat tento kód na starém C++98?

Začal jsem takto:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>

// Origin coords: x, y
#define px first
#define py second
#define MAX 1000
#define INF 2147483647 // je to jen polovina rozsahu
typedef struct pair{
    long long first;
    long long second;
} pairll;

pairll pnts [MAX];
int compare(pairll a, pairll b)
{ return a.px<b.px;
}

#include <float.h>      // DBL_MAX
double closest_pair(pairll pnts[],int n)
{
        sort(pnts,pnts+n,compare);
        double best=INF;
        set<pairll> box;
        box.insert(pnts[0]);
        int left = 0;
        for (int i=1;i<n;++i)
        {
            while (left<i && pnts[i].px-pnts[left].px > best)
                box.erase(pnts[left++]);
            for(typeof(box.begin()) it=box.lower_bound(make_pair(pnts[i].py-best, pnts[i].px-best));it!=box.end() && pnts[i].py+best>=it->py;it++)
                best = min(best, sqrt(pow(pnts[i].py - it->py, 2.0)+pow(pnts[i].px - it->px, 2.0)));
            box.insert(pnts[i]);
        }
        return best;
}


Přičemž dostávám chybu že funkce set() není deklarována. Podobně to bude s insert. O co tam jde nebo kde sehnat manuál k tomuto set a insert? Dělám do na CodeBlocks a nejsem si úplně jistý verzí C/C++.

Nahlásit jako SPAM
IP: 94.113.178.–
JerryM0
Věrný člen
18. 11. 2022   #5
-
0
-

set<> patří do StandardTemplateLibrary (STL) a ta je dostupná jak pro C99 tak i pro C++98

https://www.geeksforgeeks.org/set-in-cpp-stl/

stačí zahrnout danou knihovnu klauzulí include

https://en.cppreference.com/w/cpp/container/set

https://www.mygreatlearning.com/blog/set-in-cpp/

a insert je metoda STL

přepis toho kodu do C++ je poměrně jednoduchý jenom vytvoříš třídu "class"

https://cplusplus.com/doc/oldtutorial/classes/

a do ní vložíš metodu s názvem 
double closest_pair(pairll pnts[],int n)

a strukturu
typedef struct pair{

problém ale je, že ty to chceš v CodeGear RAD Studiu 2022 Builder/C++

což momentálně nemá asi nikdo z nám nainstalovaný ... to je práce na 3 dny ti vyhovět ... chápeš jo ?

ale návod máš napsanej na netu

https://docwiki.embarcadero.com/RADStudio/Sydney/en/Creating_DLLs_in_C%2B%2BBuilder

potřebuješ jenom poslední RAD Studio ... to si asi stáhneš z bittorrentu...

dále nepíšeš s jakou modifikací to chceš napsat ... VCL ? Native WinAPI32 ? ... to je docela důležitá věc ... ale odhaduju že asi nativeWinAPI...

jestli se daj v RAD studiu použít DLL napsaný ve VisualStudiu to nevim, zatim sem to nikdy nedělal ale tady je manuál

https://docwiki.embarcadero.com/RADStudio/Sydney/en/Tutorial:_Using_Dynamic_Libraries_in_C%2B%2BBuilder_Applications

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:29a1:bc14:51fc:e58d...–
oxidián0
Grafoman
18. 11. 2022   #6
-
0
-

Já do nedělám v RAD já mám sice Visual Studio 2010 ale vyhovuje mi CodeBlocks IDE 13.12. Mám to všechno zastaralé, ale na základní jednodušší věci by to mohlo stačit. Tak asi jen poradit s kódem a zkompilovat to musím sám. Ale nedaří se mi rozjet ani to #include <set> nebo #include <set.h>

Pracuji na volnočasové aktivitě, je to projekt,kde lidi vyráběj věci pro druhé zadarmo a nemám fin. zdroje ani nejsem placený. Takže věc co dělám pokud se povede bude sloužit pro druhé aby mohli pracovat rychleji a efektivněji protože lidí kteří dělaj takhle jako hobby je málo. Je to algoritmus pro VŠ IT a to já nejsem. Takže nevím zda se podaří.

Pokud se nepovede zbývá jednodušší algoritmus něco jako na principu majáku, který vyšle určitý počet paprsků či signálů kolem dokola (min. 8 směrů detekce) a až narazí na barvu kterou hledám v obrazu, tak mohu zkustit detekovat okraje.

Nahlásit jako SPAM
IP: 94.113.178.–
18. 11. 2022   #7
-
0
-
Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
18. 11. 2022   #8
-
0
-

#7 hlucheucho
Hluche ucho, ale jo, já ten článek mám otevřený a četl jsem ho, ale v tom starým Codeblocks mi nejde rozjet ta hlavička #include <set> - fatal error no such file or directory. S jistotou vím jen to že verze mého C++ je starší než C++11

Nahlásit jako SPAM
IP: 94.113.178.–
18. 11. 2022   #9
-
0
-

Přičemž dostávám chybu že funkce set() není deklarována.

O tom, že nemůže najít icludovaný soubor nebyla ani zmínka. Kdyby ses pořádně podíval, tak kromě ve tvém kódu chybějící direktivy #include<set> je potřeba odkazovat na prostor jmen std, tedy  std::set<pairll> box; Vůbec by se nic nestalo, kdyby sis ten příklad zkopíroval a zkusil zkompilovat. Pokud by to proběhlo bez chyby, tak něco prasíš (docela pravděpodobné), pokud napíše, že něco chybí, pak je potřeba hledat, jak to do tvého vývojového prostředí doinstalovat.

hu

 

Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
18. 11. 2022   #10
-
0
-

#9 hlucheucho
To jsem už taky zkoušel to std:: ale problém je v tom, že to nenačte tu hlavičku set. Ano, v původním kódu co jsem poslal to není, to je pravda. Ve chvíli když jsem to odesílal jsem to ještě nevěděl.

Nahlásit jako SPAM
IP: 94.113.178.–
18. 11. 2022   #11
-
0
-
Nahlásit jako SPAM
IP: 195.178.67.–
18. 11. 2022   #12
-
0
-

Možná by bylo lepší stáhnout a instalovat Visual Studio community ed., které je pro jednotlivce zdarma.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
JerryM0
Věrný člen
18. 11. 2022   #13
-
0
-

přiznám se, že nevim kde si vzal ten kod v #4 ale to bude něco asi pro GCC kompiler pro linux a navíc to nedává smysl, sou tam blbosti pokud to chceš použít pro VisualStudio:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>

#include <set>

#include <float.h>      // DBL_MAX
#include <vector>
#include <algorithm>
#include <typeinfo> 

// Origin coords: x, y
#define px first
#define py second
#define MAX 1000
#define INF 2147483647 // je to jen polovina rozsahu

typedef struct pair {
    long long first;
    long long second;
} pairll;

pairll pnts[MAX];
int compare(pairll a, pairll b)
{
    return a.px < b.px;
}

#include <float.h>      // DBL_MAX
double closest_pair(pairll pnts[], int n)
{
    std::sort(pnts, pnts + n, compare);
    double best = INF;
    std::set<pairll> box;
    box.insert(pnts[0]);
    int left = 0;
    for (int i = 1; i < n; ++i)
    {
        while (left<i && pnts[i].px - pnts[left].px > best)
            box.erase(pnts[left++]);
        for (decltype(box.begin()) it = box.lower_bound(std::make_pair(pnts[i].py - best, pnts[i].px - best));
            it != box.end() && pnts[i].py + best >= it->py; it++) {

            best = std::min(best, sqrt(pow(pnts[i].py - it->py, 2.0) + pow(pnts[i].px - it->px, 2.0)));

        }// for 


        box.insert(pnts[i]);
    }
    return best;
}
Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:29a1:bc14:51fc:e58d...–
JerryM0
Věrný člen
18. 11. 2022   #14
-
0
-

třeba ten
box.lower_bound
má být číslo a ne std::pair ...

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:29a1:bc14:51fc:e58d...–
JerryM0
Věrný člen
18. 11. 2022   #15
-
0
-

nejde mi vložit příspěvek sakra

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:29a1:bc14:51fc:e58d...–
18. 11. 2022   #16
-
0
-

#13 JerryM
Tvrdí, že má Codeblocks

hu

Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
18. 11. 2022   #17
-
0
-

Přeinstaloval jsem ten Codeblocks a založil nový projekt C++. Headery to načetlo a teď mám chybovou hlášku:


main.h||In function 'double closest_pair(pairll*, int)':|
main.h|42|error: no matching function for call to 'std::set<pair>::lower_bound(std::pair<double, double>)'|
main.h|42|note: candidates are:|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_set.h|633|note: std::set<_Key, _Compare, _Alloc>::iterator std::set<_Key, _Compare, _Alloc>::lower_bound(const key_type&) [with _Key = pair; _Compare = std::less<pair>; _Alloc = std::allocator<pair>; std::set<_Key, _Compare, _Alloc>::iterator = std::_Rb_tree_const_iterator<pair>; std::set<_Key, _Compare, _Alloc>::key_type = pair]|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_set.h|633|note:   no known conversion for argument 1 from 'std::pair<double, double>' to 'const key_type& {aka const pair&}'|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_set.h|637|note: std::set<_Key, _Compare, _Alloc>::const_iterator std::set<_Key, _Compare, _Alloc>::lower_bound(const key_type&) const [with _Key = pair; _Compare = std::less<pair>; _Alloc = std::allocator<pair>; std::set<_Key, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator<pair>; std::set<_Key, _Compare, _Alloc>::key_type = pair]|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_set.h|637|note:   no known conversion for argument 1 from 'std::pair<double, double>' to 'const key_type& {aka const pair&}'|
main.cpp||In function 'int main()':|
main.cpp|7|error: 'cout' was not declared in this scope|
main.cpp|7|error: 'endl' was not declared in this scope|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_function.h||In instantiation of 'bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = pair]':|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_tree.h|1285|required from 'std::pair<std::_Rb_tree_iterator<_Val>, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = pair; _Val = pair; _KeyOfValue = std::_Identity<pair>; _Compare = std::less<pair>; _Alloc = std::allocator<pair>]'|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_set.h|415|required from 'std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const value_type&) [with _Key = pair; _Compare = std::less<pair>; _Alloc = std::allocator<pair>; typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator = std::_Rb_tree_const_iterator<pair>; std::set<_Key, _Compare, _Alloc>::value_type = pair]'|
U:\C++\Console\ConvexHull\convexhull\main.h|36|required from here|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_function.h|237|error: no match for 'operator<' in '__x < __y'|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_function.h|237|note: candidates are:|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_pair.h|218|note: template<class _T1, class _T2> bool std::operator<(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&)|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_pair.h|218|note:   template argument deduction/substitution failed:|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_function.h|237|note:   'const pair' is not derived from 'const std::pair<_T1, _T2>'|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_iterator.h|299|note: template<class _Iterator> bool std::operator<(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&)|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_iterator.h|299|note:   template argument deduction/substitution failed:|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_function.h|237|note:   'const pair' is not derived from 'const std::reverse_iterator<_Iterator>'|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_iterator.h|349|note: template<class _IteratorL, class _IteratorR> bool std::operator<(const std::reverse_iterator<_IteratorL>&, const std::reverse_iterator<_IteratorR>&)|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_iterator.h|349|note:   template argument deduction/substitution failed:|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_function.h|237|note:   'const pair' is not derived from 'const std::reverse_iterator<_IteratorL>'|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_tree.h|873|note: template<class _Key, class _Val, class _KeyOfValue, class _Compare, class _Alloc> bool std::operator<(const std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&, const std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&)|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_tree.h|873|note:   template argument deduction/substitution failed:|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_function.h|237|note:   'const pair' is not derived from 'const std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>'|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_set.h|721|note: template<class _Key, class _Compare, class _Alloc> bool std::operator<(const std::set<_Key, _Compare, _Alloc>&, const std::set<_Key, _Compare, _Alloc>&)|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_set.h|721|note:   template argument deduction/substitution failed:|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_function.h|237|note:   'const pair' is not derived from 'const std::set<_Key, _Compare, _Alloc>'|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_multiset.h|702|note: template<class _Key, class _Compare, class _Alloc> bool std::operator<(const std::multiset<_Key, _Compare, _Alloc>&, const std::multiset<_Key, _Compare, _Alloc>&)|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_multiset.h|702|note:   template argument deduction/substitution failed:|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_function.h|237|note:   'const pair' is not derived from 'const std::multiset<_Key, _Compare, _Alloc>'|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_vector.h|1387|note: template<class _Tp, class _Alloc> bool std::operator<(const std::vector<_Tp, _Alloc>&, const std::vector<_Tp, _Alloc>&)|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_vector.h|1387|note:   template argument deduction/substitution failed:|
mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\stl_function.h|237|note:   'const pair' is not derived from 'const std::vector<_Tp, _Alloc>'|
||=== Build failed: 4 error(s), 4 warning(s) (0 minute(s), 0 second(s)) ===|

Nahlásit jako SPAM
IP: 94.113.178.–
JerryM0
Věrný člen
18. 11. 2022   #18
-
0
-

když chci něco vložit tak se mi ztratí button "ODESLAT" 

kurvadtát posraný forum už zase nefunguje

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:29a1:bc14:51fc:e58d...–
JerryM0
Věrný člen
18. 11. 2022   #19
-
0
-

tady je ten kod co funguje

https://uloz.to/file/cUW2becVPJdG/kod-rtf#!ZJDjMwR2AGMwAzSvLJWvZ2ZlLGH4BRqxFyOZZGL2AHusZGDkMD==

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:29a1:bc14:51fc:e58d...–
oxidián0
Grafoman
18. 11. 2022   #20
-
0
-

ř.#42 začíná

for(typeof(box.begin()) it=box.lower_bound(std::make_pair(pnts[i].py-best, pnts[i].px-best));it!=box.end() && pnts[i].py+best>=it->py;it++)

Nahlásit jako SPAM
IP: 94.113.178.–
18. 11. 2022   #21
-
0
-

#18 JerryM
Chyba bude asi u tebe, nevidím, žádný problém s odesíláním příspěvků.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
JerryM0
Věrný člen
18. 11. 2022   #22
-
0
-

stahni si normalně MS VS 2022, Professional:  KEY: TD244-P4NB7-YQ6XK-Y8MMM-YWV2J

a založ si konzolovou aplikaci v C++ a tady je návod jak se udělá DLL

https://learn.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=msvc-170

neni jasný co používáš za kompiler v tom tvym CodeBlocku .. GCC++ ??? jinej ?

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:29a1:bc14:51fc:e58d...–
18. 11. 2022   #23
-
0
-

#17 oxidián
Letmý pohled: máš guláš v předávaných parametrech

huh

Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
18. 11. 2022   #24
-
0
-

#19 JerryM
Díky za kód. Napíšu jaké hlášky mi to hodilo při pokusu o kompilaci:

Chyba: in C++98 'P_in' must be initialized by constructor, not by '{...}'|

std::vector<Point> P_in = { {0,0}, {10,10}, {0,10}, {10,0} };

upozornění ke stejnému řádku (71):

warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]|

warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]|

Nahlásit jako SPAM
IP: 94.113.178.–
18. 11. 2022   #25
-
0
-

#20 oxidián
Mám pocit, že nesedí počet závorek. Příjde mi to celý domaštěný.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
18. 11. 2022   #26
-
0
-

Z nastavení:

Kompiler C

mingw32-gcc.exe

C++:

mingw32-g++.exe

make:

mingw32-make.exe

V bin/ ale jsou další soubory jako c++.exe v. 4.7.1 a g++ stejné verze a gcc taky 4.7.1.

Vše ve složce CodeBlocks_32bit\MinGW\bin

Nahlásit jako SPAM
IP: 94.113.178.–
18. 11. 2022   #27
-
0
-

#24 oxidián


Pokud trváš na C++ 98, vytvoř vector pomocí konstruktoru a pak do něj ty prvky naskládej.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
18. 11. 2022   #28
-
0
-

Ještě hledám jak vytvořit náhodné číslo v určitém rozumném rozsahu jako 50 až 250. Funkce rand() nepřijímá argumenty.

Nahlásit jako SPAM
IP: 94.113.178.–
18. 11. 2022   #29
-
0
-

#28 oxidián
Pokud její návratovou hodnotu vynásobíš vhodným koeficientem a přičteš jiný vhodný koeficient ...

hu

Nahlásit jako SPAM
IP: 195.178.67.–
18. 11. 2022   #30
-
0
-
Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
18. 11. 2022   #31
-
0
-

#30 hlucheucho
Přiznám se že jsem tomu kodu s modulo neporozumněl, ale hlavně že funguje. Je to krása ten kód. Aspoň tedy pro mě :) Díky. Dále se budu snažit přijít na to jak to předělat na knihovnu a použít to v Delphi. Protože Delphi je pro mě jednodušší a poněkud bližší. Takže zkusím vzít například obrázek nebo výstup z obrazovky a asi by to ještě chtělo dodělat, aby to umělo pracovat s handle (tužím že se tam předává handle na DC - device context nebo tak něco). Takže místo pole náhodných čísel tam budou skutečné data z obrazovky nebo z obrázku.

Dále by stálo za přemýšlení zda bude možné zjednodušit algoritmus protože v některých situacích můžeme bezpečně říct, kdy nepotřebujeme bod ukládat. Například, když předchozí souřadnice byla 20,21 a nyní máme 20,22, bezpečně víme, že bude minimálně jeden bod vypuštěn. Takže je možné uložit oldX=20; a při další interakci zase provést porovnání takže když x=20 a oldX=20 tak zase není třeba bod ukládat. To jen mě teď napadlo - co nevím - protože tomu algoritmu stejně nerozumím, jdestli to půjde. Ale pokud jo, bude to fajn. Takže dnes asi pauza a zítra se podívám na Delphi nebo jak to předělat do dll v C++.

Jo a tady je ten kod co jsem testoval:

// ConvexHull.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>

#include <set>

#include <float.h>      // DBL_MAX
#include <vector>
#include <algorithm>
#include <typeinfo>

#include <cstdlib> // rand()
using namespace std;
#include<ctime> // time()


// Origin coords: x, y
#define px first
#define py second
#define MAX 1000
#define INF 2147483647 // je to jen polovina rozsahu

struct Point {
    double x, y;
};
bool compare(Point a, Point b)
{
    return a.x < b.x || (a.x == b.x && a.y < b.y);
}
//Returns positive value if B lies to the left of OA, negative if B lies to the right of OA, 0 if collinear
double cross(const Point& O, const Point& A, const Point& B)
{
    return (A.x - O.x) * (B.y - O.y) - (A.y - O.y) * (B.x - O.x);
}

//Returns a list of points on the convex hull

std::vector<Point> convex_hull(std::vector<Point> P)
{
    int n = P.size(), k = 0;
    std::vector<Point> H(2 * n);
    std::sort(P.begin(), P.end(), compare);
    // Build lower hull
    for (int i = 0; i < n; ++i) {
        while (k >= 2 && cross(H[k - 2], H[k - 1], P[i]) <= 0) k--;
        H[k++] = P[i];
    }

    // Build upper hull
    //i starts from n-2 because n-1 is the point which both hulls will have in common
    //t=k+1 so that the upper hull has atleast two points to begin with
    for (int i = n - 2, t = k + 1; i >= 0; i--) {
        while (k >= t && cross(H[k - 2], H[k - 1], P[i]) <= 0) k--;
        H[k++] = P[i];
    }
    //the last point of upper hull is same with the fist point of the lower hull
    H.resize(k - 1);
    return H;
}


int main()
{

    std::cout << "Hello World!\n";

    std::vector<Point> P_in;
    srand(time(0));
    std::cout << "Input vector points: ";
	for(int a = 0; a < 35; a++)
	{
        for(int b = 0; b < 20; b++)
        {
          int x = rand() % 100;
          int y = rand() % 100;
        std::cout << x << "  " << y;
        std::cout << '\n';
		P_in.push_back({x, y});
        }
	}


    //std::vector<Point> P_in = { {0,0}, {10,10}, {0,10}, {10,0} };

    std::vector<Point> P_out = convex_hull(P_in);

    std::cout << "Output vector size: " << P_out.size();
    std::cout << '\n';
    for (int i = 0; i < P_out.size(); i++) {

        std::cout << P_out[i].x << "  " << P_out[i].y;
        std::cout << '\n';

    }// for

}// main
Nahlásit jako SPAM
IP: 94.113.178.–
oxidián0
Grafoman
18. 11. 2022   #32
-
0
-

Pochopil jsem to tedy tak, že musím napsat algoritmus na čtení dat (konkrétně souřadnic z obrázku). Uživatel klikne někam dovnitř polygonu a já musím v Delphi napsat aplikaci, která přečte jednotlivé řádky (většina je řerná barva, takže většina bodů bude ignorována a předá se jen to co je v rozsahu tmavě zelené barvy). Když vytvořím funkci či proceduru v Delphi, která zavolá proceduru ConexHull.dll, tak je možné předat odkaz na tuto proměnnou a sdílet mezi aplikacemi paměť, tedy to pole se souřadnicemi?

Nahlásit jako SPAM
IP: 94.113.178.–
18. 11. 2022   #33
-
0
-

Při realizaci dll narazíš na potíže s Delphi nekompatibilním vectorem, který je parametrem a návratovou hodnotou funkce. Dále budeš muset nastudovat další aspekty související s kompatibilitou dll s Delphi. Má to docela dost úskalí.

V podstatě z hlavního programu voláš jen jednu funkci. Spíš bych uvažoval o přepsání do Delphi. Ekvivalent std::vector a std::sort by se asi dali najít a nebo v nejhorším implementovat.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
18. 11. 2022   #34
-
0
-

Při spuštění mnou vloženého kódu #31 nerozumím tomu proč jsou ve výsledku souřadnice, které jsem na vstupu nezadával. Příklad:

Output vector size: 8
0	0
49	0
98	1
99	11
99	98
90	99
17	99
0	97

Tyto body neexistují ve vstupu. Jediný existující bod je 49, 0

Všechny body ze vstupu:

97	68
34	38
74	10
62	19
26	55
87	17
90	90
3	43
78	23
58	53
56	61
40	3
92	80
12	57
70	71
79	65
60	59
92	90
27	66
62	27
37	13
58	35
41	88
67	98
74	87
76	48
67	12
13	9
54	72
76	29
99	66
13	80
83	11
67	56
14	91
14	61
86	30
58	85
90	54
97	18
18	44
92	17
43	1
49	0
89	19
65	75
70	65
24	62
98	91
14	34
49	1
65	69
21	22
94	30
33	27
28	57
1	85
62	43
83	20
61	2
86	41
6	28
12	67
25	89
21	44
94	29
81	33
59	51
10	48
54	2
36	76
20	57
65	39
22	78
25	51
56	18
56	98
11	21
93	68
27	59
19	85
81	78
34	19
32	82
73	4
2	65
65	20
34	37
40	10
85	6
71	5
2	68
97	25
33	12
81	85
66	18
17	7
62	44
96	42
17	61
81	64
83	47
90	8
17	33
7	9
10	79
66	12
27	88
23	62
71	35
48	30
43	25
91	73
1	62
95	83
41	97
95	37
16	77
53	76
53	97
70	21
2	77
54	28
24	98
39	62
69	81
69	98
49	24
1	88
74	62
94	5
61	83
63	14
2	49
94	19
15	64
17	5
72	49
83	67
12	31
1	81
80	45
89	14
76	7
31	68
34	43
94	37
24	27
49	17
84	88
31	89
37	16
24	94
48	73
41	30
72	37
85	14
7	85
56	25
72	82
80	28
13	1
31	27
42	53
73	50
18	86
10	95
54	88
50	27
34	30
11	16
10	13
87	2
58	60
22	36
50	5
6	33
21	95
45	46
55	70
6	54
36	36
21	37
55	93
12	21
47	65
22	38
0	44
86	20
57	58
7	43
49	16
15	14
12	23
12	26
64	64
42	45
19	92
82	38
62	93
10	96
78	20
98	75
6	88
87	57
5	71
70	29
70	3
36	16
21	76
43	88
64	40
91	78
22	44
22	47
90	69
32	79
35	5
7	25
18	94
78	36
81	19
5	38
43	3
80	86
57	46
55	76
47	19
54	50
13	78
68	67
83	81
86	42
99	26
13	12
94	23
67	63
10	22
74	3
59	66
85	13
42	26
33	93
98	36
79	32
5	48
54	95
78	42
99	95
1	61
87	17
18	18
82	39
58	1
46	84
3	97
69	96
46	2
98	64
64	42
5	69
56	41
14	19
10	42
16	87
45	13
3	12
96	38
70	50
8	38
89	28
89	13
73	40
45	67
77	41
85	71
57	12
69	73
53	78
71	90
41	45
15	22
71	56
70	57
0	84
81	86
10	40
92	44
57	21
Nahlásit jako SPAM
IP: 94.113.178.–
JerryM0
Věrný člen
18. 11. 2022   #35
-
0
-

hm, nevim jestli napsání kodu ve VS C++ a jeho transfer do RAD studio C++ Builder/Clang je to nejlepší spíš si prostě budeš muset nainstalovat RAD studio a napsat to v C++Builderu v RAD studiu 2022

https://docwiki.embarcadero.com/CodeExamples/Sydney/en/Generic_vector_sort_(C%2B%2B)

návod na sepsání a import DLL pro MSVS C++ je tady:

https://www.codeproject.com/Articles/6351/Regular-DLL-Tutor-For-Beginners

https://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL

pro RAD studio sem to bohužel nenašel ...

jestli si nikdy nedělal v RAD studiu tak to stejně dohromady nedáš

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:f58a:e537:6981:d1e4...–
JerryM0
Věrný člen
18. 11. 2022   #36
-
+1
-
Zajímavé

je možný že ten kod co sem vzal z těch web stránek je špatně ... já nevim .. prostě sem to jenom opsal. opsal sem to co si mi dal z odkazu na tu web stránku ... chápeš jo ?

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:f58a:e537:6981:d1e4...–
JerryM0
Věrný člen
18. 11. 2022   #37
-
+1
-
Zajímavé

jinak jestli používáš kod z #31 tak musíš smazat ten kousek se souřadnicema 0,0 atd kteej ti to bude mršit .. chápeš jo ? :)

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:f58a:e537:6981:d1e4...–
oxidián0
Grafoman
18. 11. 2022   #38
-
0
-

Hele je to v pořádku. To jenom nebyl vidět začátek v konzole. Přesměroval jsem to do souboru a ejhle jsou tam všechny čísla :)

Já už uvažuju nad algoritmem na detekci vstupních bodů :) To bude taky pěkný záhul.

Nahlásit jako SPAM
IP: 94.113.178.–
oxidián0
Grafoman
19. 11. 2022   #39
-
0
-

Jaký je rozdíl mezi contejnery vector vs set? v původním kódu bylo toto:

set<pairll> box;

To se z kódu od JerryM vytratilo.

Nahlásit jako SPAM
IP: 94.113.179.–
JerryM0
Věrný člen
19. 11. 2022   #40
-
+1
-
Zajímavé

#39 oxidián

https://www.geeksforgeeks.org/difference-between-stdset-vs-stdvector-in-c-stl/

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:acd6:668e:79e4:f973...–
oxidián0
Grafoman
20. 11. 2022   #41
-
0
-

#37 JerryM
K #31 není tam chyba? Nemělo se na konci provést něco jako vyprázdnění paměti? Ten vektor byl uložený kam do stacku nebo do heapu? Musel jsem pak restartoval PC protože jelo strašně pomalu (pomalé otevírání oken).

Nahlásit jako SPAM
IP: 94.113.179.–
21. 11. 2022   #42
-
0
-

Jaký je rozdíl mezi contejnery vector vs set?

Co na to Google? Zase ses vysral na hledání. Vlastně jako vždycky.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 57 hostů

Podobná vlákna

Implementace Z-Buffer — založil Yimo

C# implementace ffdshow — založil Jiří

Implementace grafu — založil Ondřej Benda

Implementace operator[][] — založil cibule

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý