Java dessine un cercle et des lignes sur Swing
Je suis en train de dessiner un cercle avec un aléatoire centre à l'intérieur une grande plus grande surface circulaire. (Je suis en train d'essayer de simuler un homme et sa vue à l'intérieur d'une chambre!) J'ai besoin de tirer une ligne aléatoire (appelons-la ligne1) en passant par son centre de l'intersection avec la surface. line1 ne passe pas forcément le centre de la surface circulaire. J'ai aussi besoin de dessiner deux lignes formant 60 degrés, donnant sur un côté de la ligne1. Quelqu'un peut-il m'aider?
J'ai créé un exemple de ce que j'ai besoin de tirer.
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;
import java.util.Random;
import javax.swing.JFrame;
public class ShapeTest extends JFrame{
int width=500;
int height=500;
public ShapeTest(){
setSize(width,height);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String a[]){
new ShapeTest();
}
public void paint(Graphics g){
//Circular Surface
drawCircleByCenter(g, width/2, height/2, width/2);
Random r = new Random();
Point center = new Point();
center.x=r.nextInt(width/2);
center.y=r.nextInt(width/2);
drawCircleByCenter(g, center.x, center.y, width/15);
}
void drawCircleByCenter(Graphics g, int x, int y, int radius){
//g.setColor(Color.LIGHT_GRAY);
g.drawOval(x-radius, y-radius, 2*radius, 2*radius);
}
}
Qu'est-ce que la spec. pour le bleu de la ligne en pointillés? Est-il passer par le centre de de petits et de grands cercles? Ce qui détermine la ligne de centre de la verdure des lignes en pointillés? Est-il perpendiculaire au bleu pointillé? Quelle est votre question?
La ligne bleue passe par le centre de bleu, pas la plus grande surface. Il devrait être établi entre son intersection avec la plus grande surface. Il n'est PAS perpendiculaire à l'autre des lignes vertes. Les deux lignes vertes de 60 degrés. J'essaie de montrer à un homme de vision.
"La ligne bleue passe par le centre de bleu, pas la plus grande surface" OK j'arrive, mais il y a une infinité de segments de ligne (chaque arrêt à la limite de la grand cercle), qui passent tous par le centre du plus petit cercle. De la réduire à un seul, nous avons besoin d'un 2ème point par lequel la ligne passe aussi. Ce n'est que le 2ème point? ..
.. "Il n'est PAS perpendiculaire à l'autre des lignes vertes. Les deux lignes vertes de 60 degrés." Bien euh.. C'est évident, mais ne se rapportent pas à ce que je leur demandais. Si vous avez traversé l'angle de 60 degrés et a dessiné une ligne, serait de la ligne perpendiculaire à la ligne bleue?
Oh, oui! Que serait un vecteur normal perpendiculaire à la ligne bleue. Désolé pour le malentendu 🙂
La ligne bleue passe par le centre de bleu, pas la plus grande surface. Il devrait être établi entre son intersection avec la plus grande surface. Il n'est PAS perpendiculaire à l'autre des lignes vertes. Les deux lignes vertes de 60 degrés. J'essaie de montrer à un homme de vision.
"La ligne bleue passe par le centre de bleu, pas la plus grande surface" OK j'arrive, mais il y a une infinité de segments de ligne (chaque arrêt à la limite de la grand cercle), qui passent tous par le centre du plus petit cercle. De la réduire à un seul, nous avons besoin d'un 2ème point par lequel la ligne passe aussi. Ce n'est que le 2ème point? ..
.. "Il n'est PAS perpendiculaire à l'autre des lignes vertes. Les deux lignes vertes de 60 degrés." Bien euh.. C'est évident, mais ne se rapportent pas à ce que je leur demandais. Si vous avez traversé l'angle de 60 degrés et a dessiné une ligne, serait de la ligne perpendiculaire à la ligne bleue?
Oh, oui! Que serait un vecteur normal perpendiculaire à la ligne bleue. Désolé pour le malentendu 🙂
OriginalL'auteur Tina J | 2014-03-22
Vous devez vous connecter pour publier un commentaire.
Commencez par changer votre méthode pour dessiner un cercle en son centre et un rayon d'une méthode qui renvoie une
Ellipse2D
objet représentant le cercle. Cela va nous permettre de faire un peu de clipping et d'autres choses avec la forme en plus il suffit de le dessiner.Paramètre le clip à la forme de votre grand cercle empêche parasite marques à partir de faits où vous n'en voulez pas (penser "de la couleur à l'intérieur des lignes"). Ceci est important parce que quand nous dessiner des cercles et des lignes à l'intérieur du grand cercle, certains d'entre eux seront trop gros et serait autrement marquer à l'extérieur des limites du grand cercle.
Une fois que nous avons mis le clip, nous utilisons la méthode
Line2D getVector(Point2D, double, length)
avec une origine au centre d'un grand cercle, un hasard angle et une longueur aléatoire (plafonné à garder le petit cercle bleu à l'intérieur du grand cercle). Pensez à ce un hasard coordonnées polaires avec le centre du grand cercle que l'origine. Le point final de ce vecteur est utilisé pour marquer le centre du petit cercle.En utilisant le centre du petit cercle comme point de départ, nous pouvons générer des deux vecteurs dans des directions opposées (juste nier la longueur d'un pour obtenir ce que ça va dans le sens d'autres) à l'aide d'une direction aléatoire de l'angle. Nous utilisons une longueur égale au diamètre du grand cercle que les lignes de la volonté de toujours aller tout le chemin jusqu'à la lisière du grand cercle (mais pas au-delà, grâce à notre clip).
Nous simplement ajouter 60 et 120 degrés pour l'angle de nos bleues en pointillés et dessinez deux lignes vertes calculer les vecteurs de la même manière que nous avons fait pour les deux bleus pointillés, sauf que nous n'avez pas besoin de créer de nouvelles avec niée longueurs. Nous pouvons également ajouter un vecteur normal pour faire bonne mesure simplement par l'ajout de 90 degrés pour l'angle du bleu pointillé.
Enfin, nous cueillir quelques aléatoire coordonnées polaires (comme nous l'avons fait pour le petit cercle bleu) pour représenter certaines personnes, et l'aide de l'intersection de la population avec les zones créées par les différentes lignes, nous pouvons voir où ils en sont et de les dessiner avec la couleur de valeurs précodées.
Maintenant que nous avons tous les gens, nous éliminons le clip et dessinez un grand cercle et le tour est joué!
Découvrez Tracez une ligne à un angle spécifique en Java pour plus de détails sur comment j'ai calculé les vecteurs pour les lignes.
Mais assez parlé, voici le code:
va faire la première chose le matin, désolé pour l'attente
En fait, vous devriez obtenir un nouveau contexte graphique, l'ensemble de la séquence, de la peinture avec elle, puis mettez-la au rebut; abandon de la composante du GC intacte.
les modifications requises. Comment faire les choses maintenant? Également ajouté une autre méthode pour vérifier si une personne est dans un domaine spécifique, en utilisant le centre de leur cercle au lieu d'une intersection vérifier.
les gens ne devraient plus se chevauchent, et de ne plus courir dans la frontière du grand cercle.
OriginalL'auteur Sam
La logique de la géométrie s'est avéré être plus difficile que je l'avais présumé, mais c'est ce que je pense que vous êtes après.
Désolé, puisque c'est votre code, je crois qu'il est difficile pour les autres de les modifier. Je l'apprécie.
Et je ne sais pas pourquoi l'homme intérieur est toujours face à la droite...en Fait à la fois la vision de la direction et le centre doit être aléatoire.
J'ai mis à jour mon code pour dessiner 5 personnes à l'intérieur du grand cercle, et la couleur basée sur les exigences supplémentaires que vous avez demandé
OriginalL'auteur Andrew Thompson