Forums Développement Multimédia

Aller au contenu

N-Gone polygone + Trigonometrie

CODE Actionscript

10 réponses à ce sujet

#1 canado

  • Members
  • PipPipPipPipPipPipPipPip
  • 724 messages

Posté 03 December 2008 - 22:02 PM

Bonjour

je cherche a creer un N-Gone ou polygone a base de rectangle pour creer une demi-sphere


....______
.../...........\
../.............\
.|...............|

c est pas vraiment tres spherique mon truc la, mais c est pour donner une idee

en gros je commence comme ceci

Action Script


function transfDegreeToRadian(a:Number):Number
{
var r:Number = Math.PI * 2 * (a / 360);
return r;
}




var angleRef:uint = 9;
var angle = transfDegreeToRadian(angleRef);

var a:Number = 300; // largeur de mon cercle
var h:Number = a/2;

var leftPos:Number = ( a / 2);


for (var j:uint = 0; j < 180/angleRef; j++)
{

var angleLive = -1 * (( -angleRef * (1 + j)) ); //calcul de l angle au fur et a mesure de l avancement dans la boucle
var angleLiveRad = transfDegreeToRadian(angleLive); //calcul de l angle precedent en radian pour d'autres calculs
trace("angleLive :" + angleLive + " angleRad :" + angleLiveRad);



var lengthC:Number = 2*Math.sqrt(Math.abs(((Math.cos(angle/2)*a)-a))*((Math.cos(angle/2) * a) + a)); // valeur de mon cote C qui correspond a la largeur du rectangle qui se trouve sur la tangente du cercle

trace("lengthC :" + lengthC);

var lengthB:Number = Math.abs(Math.sin(angleLive / 2) * lengthC) ; // positionnement de mon rectangle sur les X
var lengthH:Number = Math.sqrt(lengthC * lengthC + lengthB * lengthB); // positionnement de mon rectangle sur les Y
trace("lengthH :" + lengthH);


var firstLengthB:Number;
var firstLengthH:Number;

if (j == 0)
{
firstLengthB = lengthB;
firstLengthH = lengthH;
}
if (j > 0)
{
lengthB = lengthB + previousLengthB;
lengthH = lengthH + previousLengthH;
}


var previousLengthB:Number = lengthB;
var previousLengthH:Number = lengthH;
trace("lengthB :" + lengthB);


var myLine:Shape = new Shape();
myLine.graphics.lineStyle(2, 0xFF6600);
myLine.graphics.beginFill(0xFFCC00, 1);
myLine.graphics.drawRect((leftPos-firstLengthB)+lengthB, (h+firstLengthH)-lengthH, 20, lengthC);
myLine.graphics.endFill();
myLine.rotation = angleLive;
addChild(myLine);

}

bon voila le resultat est pas tres proche d une sphere
mais ca fait longtemps que j ai pas fait de trigo, tres longtemps

une petite piste?

Fichier(s) joint(s)


Modifié par auricom, 03 December 2008 - 22:02 PM.


#2 jinmoku

  • Members
  • PipPipPipPipPipPipPipPip
  • 564 messages

Posté 03 December 2008 - 22:10 PM

pas bien compris , mai tu veux faire une arche avec des brique de la meme longueur en gros ?

#3 canado

  • Members
  • PipPipPipPipPipPipPipPip
  • 724 messages

Posté 03 December 2008 - 22:10 PM

oui c est ca

#4 la pieuvre

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3055 messages

Posté 03 December 2008 - 22:32 PM

pour être bien sur de comprendre moi aussi tu veux faire u demi cercle avec des briques de taille fixe genre :

Fichier(s) joint(s)



#5 canado

  • Members
  • PipPipPipPipPipPipPipPip
  • 724 messages

Posté 03 December 2008 - 22:35 PM

c est exactement ca, sauf que l ideal serait que les paves se superposent un peu plus pour que les zones qui se touchent aient une surface commune plus grande

#6 jinmoku

  • Members
  • PipPipPipPipPipPipPipPip
  • 564 messages

Posté 03 December 2008 - 22:40 PM

bon c'est pa top mais tu peu tester ca

Action Script


var nr:int=12;
var sprite:Sprite = new Sprite();
sprite.graphics.lineStyle(1, 0xff00ff);
sprite.graphics.moveTo(stage.stageWidth * 0.5, stage.stageHeight * 0.5);
for (var i:int = 0; i < nr; i++) {
var ax:Number = Math.cos(Math.PI * (i / (nr - 1)));
var ay:Number = Math.sin(Math.PI * (i / (nr - 1)));
var dx:Number = Math.cos(Math.PI * ((i + 1) / (nr - 1)));
var dy:Number = Math.sin(Math.PI * ((i + 1) / (nr - 1)));
var xp:Number=100*ax+stage.stageWidth*0.5;
var yp:Number=-100*ay+stage.stageHeight*0.5;
var dxp:Number=100*dx+stage.stageWidth*0.5;
var dyp:Number=-100*dy+stage.stageHeight*0.5;

sprite.graphics.lineTo(xp, yp);
sprite.graphics.lineTo(xp + 10 * dx, yp - 10 * dy);
sprite.graphics.lineTo(dxp + 10 * dx, dyp - 10 * dy);
sprite.graphics.lineTo(dxp, dyp);
sprite.graphics.moveTo(xp, yp);
}
sprite.graphics.lineTo(stage.stageWidth * 0.5, stage.stageHeight * 0.5);
sprite.graphics.endFill();

addChild(sprite);


#7 canado

  • Members
  • PipPipPipPipPipPipPipPip
  • 724 messages

Posté 03 December 2008 - 22:55 PM

salut stealth35

ca se tient sauf que j ai besoin de un var sprite par rectangle, pas de moveTo, seulement un repositionement des sprite rectangle pour faire la forme c est tu faisables avec ton code, je vais essayer

#8 la pieuvre

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3055 messages

Posté 03 December 2008 - 22:59 PM

vite fait ça donne ça :

Action Script

var nbBric:Number = 10;
var hauteurBrick:Number = 10;
var rayon:Number = 150;
var centrex:Number = 200;
var centrey:Number = 200;

function Bric(l:Number):MovieClip{
var mc:MovieClip = new MovieClip();
mc.graphics.beginFill(0xff0000,1);
mc.graphics.drawRect(0,0,hauteurBrick,l);
mc.graphics.endFill();
return mc;
}

var angle:Number = Math.PI/2/nbBric
var l:Number = Math.sin(angle)* rayon*2;
trace(l)
for (var i:Number = 0 ; i< nbBric; i++) {
var mc:MovieClip = Bric(l);
mc.x = centrex + Math.cos(i*angle*2)*rayon;
mc.y = centrey + Math.sin(i*angle*2)*rayon;
mc.rotation = (180/nbBric*i)
addChild(mc)
}

reste à pofiner

Fichier(s) joint(s)



#9 canado

  • Members
  • PipPipPipPipPipPipPipPip
  • 724 messages

Posté 03 December 2008 - 23:02 PM

c est super ca me donne une tres bonne base

merci beaucoup

#10 la pieuvre

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3055 messages

Posté 03 December 2008 - 23:08 PM

et hop une version final wink.gif

Action Script

var nbBric:Number = 25;
var hauteurBrick:Number = 10;
var rayon:Number = 150;
var centrex:Number = 200;
var centrey:Number = 200;

function Bric(l:Number):MovieClip{
var mc:MovieClip = new MovieClip();
mc.graphics.beginFill(0xff0000,1);
mc.graphics.drawRect(0,0,hauteurBrick,l);
mc.graphics.endFill();
return mc;
}

var angleR:Number = Math.PI/2/nbBric
var angle:Number = 180/nbBric
var l:Number = Math.sin(angleR)* rayon*2;
for (var i:Number = 0 ; i< nbBric; i++) {
var mc:MovieClip = Bric(l);
mc.x = centrex - Math.cos(i*angleR*2)*rayon;
mc.y = centrey + Math.sin(i*angleR*2)*rayon;
mc.rotation = -(angle*i)-(angle/2)
addChild(mc)
}

Fichier(s) joint(s)



#11 r3b00t

    Ceinture Bleue

  • Members
  • PipPipPipPipPip
  • 82 messages

Posté 03 December 2008 - 23:50 PM

Citation (la pieuvre @ Dec 3 2008, 11:08 PM) Voir le message
et hop une version final wink.gif

Action Script

var nbBric:Number = 25;
var hauteurBrick:Number = 10;
var rayon:Number = 150;
var centrex:Number = 200;
var centrey:Number = 200;

function Bric(l:Number):MovieClip{
var mc:MovieClip = new MovieClip();
mc.graphics.beginFill(0xff0000,1);
mc.graphics.drawRect(0,0,hauteurBrick,l);
mc.graphics.endFill();
return mc;
}

var angleR:Number = Math.PI/2/nbBric
var angle:Number = 180/nbBric
var l:Number = Math.sin(angleR)* rayon*2;
for (var i:Number = 0 ; i< nbBric; i++) {
var mc:MovieClip = Bric(l);
mc.x = centrex - Math.cos(i*angleR*2)*rayon;
mc.y = centrey + Math.sin(i*angleR*2)*rayon;
mc.rotation = -(angle*i)-(angle/2)
addChild(mc)
}


C'est sympa la trigo icon_biggrin.gif




1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP