Suite

API ArcGIS pour JavaScript - Créez un simple tampon ou un graphique circulaire par rapport à un point


Je suis coincé, essayant de comprendre comment créer un graphique simple pour ajouter un cercle basé sur un point de ma carte Web. J'ai besoin que le cercle soit centré sur mon seul point, avec un rayon de 5 miles. J'ai vu des exemples pour le cercle géodésique et cela n'a pas fonctionné pour moi, ainsi que la création d'un tampon, dont je ne pense pas avoir besoin. J'ai juste besoin d'un simple graphique circulaire. Y a-t-il un moyen simple de le faire ? J'ai une carte avec un point et j'ai besoin de ce graphique pour une limite. Je m'excuse car je suis nouveau dans ce domaine et j'essaie d'apprendre cette API rapidement.

Merci


Cela vous donnera un cercle géodésique de 5 miles autour d'un point prédéfini.

          

Depuis le site Web d'ArcGIS : il semble que votre pari le plus simple soit l'outil tampon

vous devriez pouvoir dessiner un cercle tampon avec les exemples contenant la commande buffer_analysis() situé sur le lien de la page ci-dessus.

Il y a également eu une discussion plus tôt sur la création d'un polygone circulaire simplifié au lieu de l'outil tampon que vous pourriez être intéressé à vérifier.


Utilisez votre point comme base pour une géométrie de cercle. L'exemple de création de cercles montre comment utiliser cette classe.


Il y a quelques choses évidentes qui ne se limitent pas aux bibliothèques d'analyse d'images :

  • Ne présumez pas que l'entrée est bien formée mais vraiment vérifier. C'est en fait un problème courant avec les bibliothèques d'images ou de vidéos qu'elles n'aient pas été conçues avec des entrées délibérément malformées mais qu'elles soient néanmoins utilisées pour traiter des entrées d'origine douteuse.
  • Utiliser un langage de programmation sûr qui, par conception, n'est pas affecté par les débordements de tampon ou le rend au moins très improbable. Cela signifie utiliser un langage qui ne permet pas d'écrire en dehors des limites du tableau et qui ne permet pas de doubler la mémoire libre ou des problèmes de gestion de mémoire similaires. La plupart des langages de niveau supérieur n'ont pas ce genre de problèmes bien qu'ils puissent affecter les performances plus que vous ne le souhaitez. Mais il existe également des langages de niveau inférieur comme Rust qui offrent à la fois la sécurité de la mémoire et des performances élevées.
  • Limiter l'impact des erreurs de programmation en utilisant des mécanismes spécifiques au compilateur ou à l'échelle du système qui protègent la pile (canaris), empêchent l'exécution de code à partir de la pile, fournissent une sorte de bac à sable autour de l'application, etc.

Pour développer un point de la réponse de Steffen : chaque fois que vous avez du code qui consomme des entrées non fiables et considéré comme un risque d'exploitation - comme une bibliothèque d'images consommant des fichiers provenant de sources non fiables - vous devriez envisager de mettre ce code en bac à sable. Il existe un certain nombre de façons de le faire, variant selon des éléments tels que la langue, le système d'exploitation et l'architecture du processeur, mais voici quelques-unes des plus courantes :


Comment configurer DMA pour recevoir des messages USART de longueur variable ?

J'essaie de recevoir des messages USART sur un microcontrôleur provenant du PC qui lui ordonnera d'exécuter certains tests. J'utilise STM32F4, j'ai choisi d'utiliser DMA car les messages sur le même USART provenant du microcontrôleur devraient être à 2000000bps car je ne pouvais pas le faire fonctionner avec un débit binaire inférieur ou sans DMA. J'utilise du binaire plutôt que de l'ASCII dans les deux sens.

Ce que j'ai conçu jusqu'à présent "fonctionne" (mise à jour en temps réel presque) à condition que le taux de messages envoyés soit constant car chaque nouveau message force le précédent à être vidé du registre DMA. Si vous lancez et n'avez qu'une seule instruction/trame USART envoyée qui se trouve être inférieure à la quantité de données à recevoir pour HAL_UART_Receive_DMA() , le message est bloqué jusqu'à ce qu'il soit poussé par le message suivant.

Un scénario encore pire serait si USART_take_size est de 100 et qu'il y a une seule trame de 10 octets dans le tampon DMA. Dans ce cas, je devrais attendre 9 autres trames (10 octets) avant de les recevoir toutes en même temps.

Voici à quoi ressemble mon rappel actuellement.

Un thread extrait des octets du tampon circulaire, les boucle et, sur la base des octets SOF et EOF, extrait le message à l'intérieur du cadre.

Mon problème est que les trames qui arrivent sont de longueur variable, si USART_take_size est défini sur x et que la trame arrive et que sa longueur est inférieure à x, elle devra rester dans le tableau de tampons dans le thread d'extraction jusqu'à ce qu'une autre trame arrive ce qui fait apparaître les octets nécessaires à l'analyseur pour obtenir le message incorporé.

Je vois trois façons de résoudre ce problème et chacune ne semble pas correcte :

Avoir une taille de trame fixe et remplir le contenu avec des zéros avant EOF si le contenu est inférieur à USART_take_size . Cela semble juste bâclé et inutile. Il devrait également se déclencher à chaque trame même si le taux global à cette instance pourrait être beaucoup plus élevé.

Configurez le DMA pour déclencher l'ISR sur un nombre variable d'octets reçus, à condition qu'il y ait eu un certain nombre d'inactivité le précédant.

Je ne connais pas grand-chose au DMA, et bien que cela semble être un compromis entre le nombre d'ISR déclenchés et le message minimum que vous pouvez lire, je pense qu'il devrait y avoir un moyen de recevoir un message après une période d'inactivité. Toute autre approche pour résoudre ce problème serait formidable. Merci!


Cela ressemble à un onduleur à déclenchement schmitt comme celui-ci (mais pas celui-ci car les broches sont différentes). Il devrait y avoir un Vcc et un gnd pour cette partie ailleurs dans le schéma.

Il s'agit soit d'un onduleur à déclenchement de Schmitt, soit d'un tampon à déclenchement de Schmitt. Je ne sais pas si la sortie a un cercle ou une flèche dessus. Le diagramme d'hystérésis implique qu'il s'agit d'un onduleur, mais cela pourrait être faux.

Edit : comme le souligne @duskwuff, d'un point de vue fonctionnel, c'est sans aucun doute un onduleur. Les numéros de broche correspondent à l'onduleur ST à porte unique SN74LVC1G14 et à d'autres pièces à porte unique similaires.

Les portes à déclenchement de Schmitt ont une hystérésis d'entrée qui peut aider à nettoyer les formes d'onde lentes ou quelque peu bruyantes. Dans ce cas particulier, il ne semble pas faire grand-chose à cet égard, mais cela ne fera pas beaucoup de mal (il aura tendance à avoir les sorties RAM se battre un peu plus longtemps pendant les transitions de commutation qu'un onduleur 74LS04 ordinaire, probablement pas une grosse affaire).


Il existe de bonnes applications pour visualiser les données série, notamment :

MegunoLink (29,95 $ Lite gratuit) - traçage, journalisation, programmation, rapports et plus encore.

MakerPlot (39 $) - traçage numérique et analogique, surveillance, interfaces personnalisées et plus encore.

arduino-plotter (gratuit) - tracé facile et léger avec prise en charge de tous les types primitifs

Panneau de configuration Bridge (gratuit) - journalisation, traçage, etc.

RealtimePlotter (gratuit) - Tracé de données sur 6 canaux.

Traceur de données série en temps réel (gratuit) - Traçage de données CSV, journalisation et plus encore.

Arduino Serial Plotter (gratuit) - construit dans Arduino Editor sous Outils > Traceur série.

(Ceci est un wiki communautaire, vous pouvez étendre la liste.)

Avantages : Il est très flexible, scriptable et disponible gratuitement.

Inconvénients : Un peu complexe à apprendre (mais j'ai compris comment démarrer en quelques minutes, et assez fonctionnel en une heure ou deux), s'exécute dans une fenêtre de terminal (si vous considérez cela comme un inconvénient).

Quelque chose que j'ai trouvé très utile était de le scripter pour recharger périodiquement le fichier journal de mon programme de terminal afin d'obtenir un graphique dynamique au fur et à mesure que mon expérience progressait.

Edit : Voici le script GnuPlot qui le trace :

J'utilise Matplotlib pour tout traçage que je dois faire.

Ce n'est en aucun cas spécifique à Arduino, mais c'est un très bon Python boîte à outils de traçage.

J'ai créé un certain nombre d'applications qui tracent les données d'une variété de microcontrôleurs en temps réel sur un graphique, mais il s'agissait en réalité d'un processus en deux étapes : 1. Transférer les données de l'appareil vers l'ordinateur, 2. Tracer les données en temps réel .

Vraiment, je pense que vous devriez diviser votre question en deux parties :

  • Comment transférer facilement les données d'un périphérique série Arduino/n'importe quel ordinateur vers un ordinateur.
  • Qu'est-ce qu'une bonne bibliothèque de traçage facile à utiliser.

SerialPlot (gratuit). Il fait tout ce dont vous avez besoin et bien plus encore.

  • Zoom sur les données
  • Cliquez sur les points de données pour voir les valeurs
  • Renvoyer des commandes à Arduino
  • Ajuster le nombre total de points tracés
  • Possibilité d'afficher chaque canal dans son propre tracé mis à l'échelle automatique
  • Interprète les paquets binaires, ASCII et personnalisés
  • Le mode démo vous permet de jouer avec les fonctionnalités

Répondant à ma propre question ici .. J'utilise Bridge Control Panel comme mentionné.

Avantages : Nombreuses fonctionnalités.

Inconvénients : difficile à configurer et très mauvais rapport de syntaxe/d'erreur.

Pour utiliser : vous devez écrire les données Arduino sur le port série un octet à la fois. Pour un type de données int qui ressemblerait à ceci :

Dans Bridge, la commande pour lire les données est :

RX8 est la commande de lecture [h=43] signifie que le prochain octet valide est "C" en ASCII puis l'octet de poids fort de Key1 puis l'octet de poids faible de Key1

Cela ressemble à ceci dans Bridge :

Tu peux essayer tableau de série. C'est un programme avancé assez simple. Il fait exactement ce que vous avez demandé. Le seul inconvénient est qu'il nécessite des données au format CSV (ne répond pas au premier point).

Capture d'écran de la page du projet :

Vous pourriez être intéressé par Télémétrie Voir sur Github . C'est un protocole de communication, très simple à utiliser, avec une interface propre, qui permet une communication bidirectionnelle avec les appareils Arduino/Mbed.

La puissance de cette bibliothèque vient de l'interface de ligne de commande du bureau (qui nécessite non compétences en programmation en python).

Il est capable d'ouvrir des parcelles performantes (beaucoup plus élevées que ce qui peut être fait avec matplotlib) juste en tapant une commande.

Le protocole prend en charge structures de données complexes. Pour l'instant tableaux et des tableaux clairsemés peuvent être envoyés depuis la carte embarquée.

Les tracés ouverts à partir de l'interface de ligne de commande comprennent le type de données, et pour les tableaux, plutôt que de tracer chaque échantillon en fonction du temps, l'échantillon sera tracé par rapport à son propre indice.

Dans un avenir proche, il est prévu d'ajouter prise en charge des coordonnées spatiales (données xyz), qui vous permettront de tracer immédiatement des données spatiales. Encore une fois, les tracés comprendront tout, traceront vos données dans un espace 2D ou 3D et vous pourrez vous concentrer sur le développement de votre application.

Je crois que ces caractéristiques sont simplement unique pour un tel projet.


2 réponses 2

Ce n'est pas techniquement une réponse à votre question, mais c'est une meilleure solution à mon avis.

Vous pouvez transmettre les dimensions des boîtes et le rayon des coins aux shaders de fragments et arrondir les coins de cette façon.

Fondamentalement, vous prenez les coordonnées de la texture actuelle, multipliez chaque coordonnée par les dimensions de la fenêtre pour obtenir les coordonnées du fragment actuel par rapport à la fenêtre. Ensuite, si la distance entre cette position et chacun des bords est inférieure au rayon du coin, alors vous le jetez.

De cette façon, vous n'avez pas besoin de télécharger des sommets séparés pour chaque fenêtre.

Exemple de code en GLSL (je ne sais pas ce que vous utilisez)

Le principal problème avec le dessin d'objets 2D ronds à l'aide de la géométrie 3D est qu'il n'y a pas de véritable mappage fixe entre les pixels à l'écran et l'espace monde 3D. S'assurer qu'ils examinent toutes les résolutions et diverses transformations peut devenir très délicat très rapidement, et vous ne voulez pas vraiment passer du temps sur quelque chose qui n'améliore pas vraiment la qualité du jeu. Mais vous avez raison, vous ne pouvez pas non plus étirer une seule texture et obtenir un bon effet.

Une manière typique de procéder dans les interfaces graphiques 2D est la mise à l'échelle à 9 tranches. Au lieu d'avoir une texture logique, vous en avez neuf - une pour chaque coin, une pour chaque bord et une pour le reste. Les coins ne sont pas du tout redimensionnés, seulement déplacés à leur place. Les bords sont répétés (ou parfois mis à l'échelle) dans leur direction appropriée (par exemple, le bord supérieur sera répété dans la direction X). Le centre est répété dans les deux sens. Cela vous permet de redimensionner la fenêtre à volonté.

Si vous souhaitez conserver la géométrie 3D, les pixel shaders semblent être la meilleure solution - après tout, vous essayez d'adapter l'effet à la écran, pas l'espace-monde. Dessiner une simple section de cercle est trivial avec juste un peu de maths, bien que s'assurer que vous obtenez un bel anti-aliasing, etc. peut rendre cela plus délicat. Le principal avantage par rapport à la méthode des textures est que vous pouvez la redimensionner arbitrairement sans étirer les textures. Le principal inconvénient est que vous ne ferez que des motifs très simples (et plus le motif est compliqué, plus le GPU est exigeant). Bien sûr, vous pouvez également combiner les deux approches - avoir une texture qui est appliquée aux parties "solides" de la fenêtre mais pas aux parties transparentes, et répétée au besoin.


La réutilisation ne nécessite pas d'allocation de mémoire, elle pourrait donc être plus rapide car @Mike Nakis mentionné. D'un autre côté, cela conduit à un code moche : vous utilisez la même variable pour deux (ou plusieurs) objectifs différents, ce qui pourrait dérouter les lecteurs, rendre la maintenance plus difficile. À moins que vous n'ayez une bonne raison de le faire, évitez-le. Je veux dire, vous avez une bonne raison si un profilage montre que la création de nouvelles instances StringBuilder est un goulot d'étranglement dans l'application.

Si vous devez vraiment réutiliser StringBuilder , essayez d'y accéder avec des noms différents avec une méthode d'assistance :

Cela rend le code un peu plus lisible, car le nom de la méthode indique pourquoi vous réutilisez le StringBuilder .


Vous ne voulez pas envoyer l'entrée du joueur au serveur. Ce que vous voulez probablement faire, c'est envoyer une représentation abstraite de ce que le joueur veut faire au serveur, puis y exécuter la logique.

De même, vous ne voulez pas nécessairement renvoyer tout ce que le client doit faire. Par exemple, vous pouvez envoyer une sorte de message disant "NPC X est mort", et le client détermine quelle animation/sons jouer. Des trucs comme ça.

L'astuce consiste à trouver la ligne où la bande passante et la puissance de traitement (sur le serveur) sont dépassées en empêchant les gens de tricher. Habituellement, vous prenez toute sorte de décision faisant autorité qui change la donne sur le serveur uniquement et laissez tous les éléments visuels auxiliaires au client.

Il y a beaucoup de questions plus spécifiques sur ce sujet partout sur le site. Par example:

Eh bien, vous avez des réponses, mais votre vraie réponse est "essayez-vous". Les choses diffèrent d'un jeu à l'autre.

J'ai fait quelques jeux multijoueurs pour un cours de conception de jeux en réseau distribué. Le plus difficile était de faire un jeu d'action en temps réel où de nombreux joueurs participaient et envoyaient des entrées comme un enfer. Quand il s'agit de ce point, tout devient problème. Comme vous voyez le premier lien envoyé par Tetrat, même déterminer une collusion devient un problème. Et vous lirez-entendrez des termes tels que décalage, interpolation, extrapolation, prédiction. Mais si vous n'avez jamais essayé de coder à partir de zéro, vous accepterez simplement ces mots et ne saurez pas ce qu'ils signifient vraiment.

Étape 1
Commencez simplement par une conception basée sur un serveur entièrement autorisé pour le moment. Comme vous l'avez dit, envoyez simplement les entrées utilisateur au serveur et laissez le serveur faire tout et les clients obtiennent les résultats. Votre jeu fonctionnera de manière totalement cohérente. Mais lorsque vous regardez vos clients, vous remarquerez des décalages, des problèmes de téléportation, des mouvements pas fluides. etc.

Étape 2
Commencez à résoudre les problèmes côté client. Les problèmes de téléportation par exemple. Votre personnage était à (0,0) et le serveur a dit que maintenant vous êtes à (100,100). Votre personnage se téléportera simplement à (100 100), ce qui n'est pas agréable. Vient l'interpolation. Vous devriez avoir un code côté client qui fera glisser le caractère de (0,0) à (100, 100) de manière fluide. Oui, vous allez déplacer votre personnage de (0,0) à (100,100) mais à quelle vitesse ? Pour l'instant, vous pouvez simplement utiliser le décalage horaire entre chaque mise à jour du serveur. Si votre serveur envoie 10 paquets en une seconde, ce qui signifie un délai de 100 ms entre chaque paquet.

Étape 3
Maintenant, votre jeu est déjà bon pour les réseaux rapides où il y a un délai de (1-50) ms. Mais il est voué à l'échec s'il y a une perte de paquets, une latence élevée ou un calcul long sur le serveur. etc. Dans ces situations, vous remarquerez que lorsque vous appuyez sur la flèche gauche, vous verrez votre personnage se déplacer vers la gauche avec un délai de 200 ms. Le délai entre votre paquet passe au serveur, temps de calcul et vous revient avec votre dernière position. C'est mauvais, le pire inconvénient de la conception autorisée par le serveur. Le joueur veut que son personnage se déplace vers la gauche dès qu'il appuie sur la gauche, vous ne pouvez pas le faire attendre. Heureusement, le client a également le même code que le serveur, alors pourquoi ne pas l'exécuter immédiatement sur le client et corriger le résultat final avec la réponse du serveur ? C'est ce qu'est essentiellement la prédiction d'entrée. Le client appuie à gauche, le code de son côté le déplacera vers la gauche, après un certain temps disons 200 ms, la position réelle vient du serveur et le client corrige sa position avec lui. Si tout s'est bien passé, le client ne remarquera rien, "l'étape 2" nous aidera également avec cela.

Eh bien, net a beaucoup de tutoriels et de choses sur ce sujet. Mais il y en a 2 que j'aime beaucoup :

Vraiment bien, couvre les points noirs : mise en réseau multijoueur du moteur Valve-Source
Genre d'histoire, amusant à lire et ça vaut le coup : 1500 Archers sur 28.8 ,


Quelle est la meilleure façon de reconditionner un tableau blanc ?

Notre bureau a installé de nouveaux tableaux blancs au cours des deux dernières années. Beaucoup de ces planches sont très utilisées et sont déjà devenues inutiles - l'écriture dessus est devenue presque permanente et elles sont très tachées.

J'ai constaté que le simple fait de les nettoyer (avec un nettoyant ménager, tel que Simple Green) contribue grandement à les maintenir dans un état utilisable. Après le nettoyage, une grande partie du marqueur (80 %) peut être simplement essuyée, mais il reste encore un fort « effet fantôme ».

J'ai essayé un nettoyant pour tableau blanc commercial. C'est à peu près le même que le nettoyant ménager, mais c'est plus cher.

J'ai essayé à la fois le WD-40 et la cire pour voiture (Turtle Wax et Rain-X), comme recommandé par divers sites sur Internet. La cire de voiture ne semble pas offrir beaucoup d'amélioration. Le WD-40 est la meilleure de ces deux solutions, mais laisse le tableau un peu gras et les marqueurs ont tendance à s'étaler (seulement un peu) lorsqu'ils sont essuyés.

Quel est l'entretien recommandé pour le bon fonctionnement des planches ? Et quelle est la meilleure façon de reconditionner un tableau blanc endommagé ?


Тказ от ответственности

оготипы и торговые марки сторонних омпаний тся зарегистрированными товарными знаками их владельцев. се рава защищены.

* есплатный пробный ериод ится один месяц. его активации не нужно указывать данные банковской карты. течение этого периода вы сможете в любой момент оформить подписку на сервис. тобы продолжить работу с планом Конструктора сайтов после окончания пробного периода, вам нужно ания пробного периода, вам нужно бания сли они е есть аккаунте GoDaddy, можете включить автоматическое родление, и мы спишем с вашей поеорты родление, и мы спишем с вашей поеорты родление, и мы спишем с вашей поеорты родление, и мы спишем с вашей поеорты рок действия плана будет родлеваться автоматически до тех пор, пока вы не отмените подписку.


Voir la vidéo: Comment extraire notre terrain détude dune autre zone plus grande sur ArcGis (Octobre 2021).