mbravenboer schreef op 26 November 2002 @ 11:59:
Overigens ben je volgens mij al wel erg goed bezig met de 'extends'. Veel te vaak wordt een parameter keihard vastgelegd, waarna je er veel te weinig meer mee kan. Door aan te geven dat het ook subklassen kunnen zijn, voorkom je dat je ergens vast loopt in je ontwerp en moet gaan casten.
Ik zal binnenkort mijn engine wel ergens neerzetten. Ik denk dat je hem wel leuk vind. Op een hele elegante manier worden alle transformaties op objecten uitgevoerd met een visitor. Daarbij wordt natuurlijk een zeer fraaie macro optimalisatie toegevoegd (matrix vermenigvuldigingen worden zo wat beperkt).
ps:
ik kan niet meer met Nice werken. Het feit dat een parent type evenveel typeparameters moet hebben als een kind, vind ik onwerkbaar.
[edit] stiekum toch een stukje code.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
| public interface StructureToImage<P extends Point,M_n_n extends Matrix_n_n<M_n_n,P>>{
public void transform(Structure s, Image i, PointToScreen<P> p);
}
class DefaultStructureToImage<
P extends Point,
M_n_n extends Matrix_n_n<M_n_n,P>
> implements StructureToImage<M_n_n,P>{
public void transform(Structure s, Image i,PointToScreen<P> p){
StructureVisitorImpl<P,M_n_n> v = new StructureVisitorImpl<P,M_n_n>(p,i);
s.accepts(v);
}
}
class StructureVisitorImpl<
P extends Point,
M_n_n extends Matrix_n_n<M_n_n,P>
> implements StructureVisitor<M_n_n>{
private M_n_n _currentTrans;
private PointToScreen<P> _pointToScreen;
private Image _image;
public StructureVisitorImpl(PointToScreen<P> pointToScreen, Image i){
_pointToScreen = pointToScreen;
_image = i;
}
public void visit(ModelStructure s){
Model m = s.getModel();
//je kan het model ophalen. en met behulp van de _currentTrans
//kan je de posities van van model converteren naar posities in de ruimte.
//hier kunnen alle berekende punten in komen te staan.
List<P> finalPointList = new ArrayList<P>(m.getPointList().size());
for(Iterator<P> itt=m.getPointList().iterator();itt.hasNext();){
//mbv itt.next en _currentTrans kan je nu de nieuwe punten bepalen.
//en plaat het resultaat in resultPointList
finalPointList.add(_currentTrans.convMultiply(itt.next()));
}
for(Iterator<Visual> itt=m.getVisuals().iterator();itt.hasNext();){
itt.next().draw(_image,_pointToScreen,finalPointList);
}
}
public void visit(ComposedStructure s){
for(Iterator<Structure> itt = s.getChildren().iterator();itt.hasNext();){
itt.next().accepts(this);
}
}
public void visit(TransStructure<M_n_n> s){
//sla de lagere transformatie schema op.
M_n_n lowerTrans = _currentTrans;
_currentTrans = _currentTrans.multiply(s.getTransMatrix());//concatination of lower and s his transformation matrix
s.getParent().accepts(this);
_currentTrans = lowerTrans;//hersteld de huidge transformatie
}
} |
Die PointToScreen zet de coordinaten van een Punt om naar coordinaten op een scherm. Je kan dan ook heel eenvoudig een maken met perspectief of een zonder. Het is maar detail gedrag, en dat geef je dus mee als strategy. En die transmatrix kan je ook heel eenvoudig nog even een camera transformatie bijop zetten dus dat is ook geen probleem
[
Voor 73% gewijzigd door
Alarmnummer op 26-11-2002 12:40
]