KONG's blog
Nhà mới tại: http://kong.vn
30/12/11
Sài gòn một đêm
Sài gòn đạp xe trong đêm thấy thoả mái hẳn đi, ít xe cộ, vắng lặng như là cái Phú Mỹ Hưng ấy.
Dù là vắng, nhưng ta vẫn có thể nhận ra một vài nhóm người, mà đêm vẫn là thời gian hoạt động chính.
Dễ thấy nhất là các anh bảo vệ. Khắp thành phố là các toà nhà cao tầng, vì vậy lúc về đêm, khắp thành phố là những anh bảo vệ, và những chú công an đứng gác nữa. Phía dưới các toà nhà tắt điện, một bầu trời đem ngòm, là những tiền sảnh vẫn sáng choang ánh đèn. Sài gòn nửa đêm là lúc, vẫn còn thấy những bác xe ôm, là thời gian các anh chị lao công quét rác, những tấm áo phản quang chói lên mỗi khi có xe lướt qua, là các anh công nhân xây dựng, là các bạn công nhân xí nghiệp may cũng thức khuya. Gần tết dường như họ phải bận hơn. Sài gòn về đêm còn lượn lờ mấy bạn "gà móng đỏ" nữa.
Qúa nửa đêm, nhưng vẫn còn nhiều hàng ăn sáng điện, vẫn đông khách, Sài gòn vẫn ăn uống, ngoài vài quán nhậu, chủ yếu là các gánh hàng rong, đặc biệt là mấy xe hủ tiếu gõ.
Trong Quận 1, các anh cảnh sát vẫn làm việc hăng say, tận 2h sáng vẫn thấy bóng dáng các anh lượn lờ.
Quận 1, chuột tràn lên đường, có cả chục con bu vào 1 chỗ.
Các bạn gay, les, quái đản cũng có cơ hội tập họp trong công viên, tụm lại từng đống với nhau.
Sài gòn về đêm là Sài gòn của những người nghèo.
Xe đạp nhiều hơn, người lam lũ đi nhiều hơn, những người nằm rải rác trên khắp vỉa hè, những gánh hàng rong, những người đi đặt mối mua hàng sớm.
Sài gòn lúc 2 giờ sáng, tĩnh lặng hơn cả, Sài gòn đang ngủ. Các anh bảo vệ cũng bắt đầu ngủ trên ghế, các bác xe ôm cũng nằm trên xe, xích lô là ấm hơn cả, có chỗ ấm, có chăn... có những người ngủ lê la, có những người kê ghế sát đường, ngủ gục trên đó...
Sài Gòn về đêm nhộn nhịp nhất là ở khu Đề Thám, nhạc um sùm, từng nhóm Tây nói chuyện, lê la, phần nhiều là dân du lịch, dân Tây đã đến Sài Gòn lâu và đang làm việc, cũng tụ về đây, Anh có, Pháp có, Nga có, Nhật có, Ấn độ có, da đen cũng có,... tám đủ thứ, hình như Tây gặp nhau, chúng nói nhiều hơn, la cà cho đến sáng...
Các bạn trường nghệ thuật như Múa, Điện ảnh, dường như ánh đèn không tắt, trước cổng ko hết nhộn nhịp dù đã 2, 3h sáng. Lạ.
Đến 3 giờ, xe mối chở trái cây bắt đầu giao hàng, ngày mới đã đến với nhiều người, công viên đã có người đẩy Thái cực. Phần lớn mọi người vẫn đang ngủ...
Sài gòn 4h, xe phát báo dừng lại tại 1 điểm trên đường Võ Thị Sáu, quanh đó vài chục chiếc xe máy tấp vào, lái xe nhanh chóng bu vào cửa sau xe ô tô, mọi người chen chúc nhau lấy báo sớm. Từng gói báo lớn được chở đi...
Sài gòn 4 giờ rưỡi sáng, nhà thờ sáng, thánh lễ.
Một đoạn đường CMT8, cua đổ bộ về, người ta bày ra và xử lý.
Báo vẫn đang được chở dần về tới các sạp...
Sài gòn 5h sáng, xe cộ đã nhiều hơn, hàng quán mở cửa, nấu nước, lặt rau, hối hả...
... chờ qua một ngày để lại được thấy Sài gòn đêm...
29/12/11
là cảm xúc
Mấy hôm nay muốn viết về điều quan trọng nhất đã xảy ra với mình trong mấy tháng vừa qua, nhưng sao mãi mà không viết được. Mình chỉ muốn nói ra một phần tâm trạng của mình: Cảm xúc. Có lẽ đây chính là phần "đen tối" nhất trong con người mình. Bởi chính mình vẫn còn chưa hiểu hết về những gì mình cảm thấy, làm sao mình nói cho người khác được. Không nói ra được tâm trạng mình càng thấy đau, càng thấy không hiểu, càng thấy bế tắc. Càng thấy đau hơn...
Mấy tháng qua mình chìm trong những đau đớn trong lòng, những sự khó chịu kinh khủng, những cảm giác chực trào lên trong lòng nhưng lại ngẹn ngào khúc mắc ở đâu đó, chỉ muốn vỡ oà ra khóc mới khiến mình thấy nguôi ngoa. Và thực sự mình đã khóc rất lâu, rất nhiều...
Giá như mình có thể than được với ai đó, chắc mình chạy ra sông mà hét lên quá...
Mình cứ suy nghĩ không biết nên viết ra lên đây những gì mình đã trải qua?
Mình ngồi im bên máy tính thêm một hồi nữa vậy, nếu thấy vẫn ổn, mình sẽ viết tiếp...
Có lần mình ngồi trong quá cafe, quay đầu vô góc, khóc như không thể dừng lại, chẳng dừng mà cũng chẳng giấu được, lúc đưa hoá đơn tính tiền, người ta kẹp thêm khăn giấy vào đó. Mình chỉ trả nhanh, đứng nhanh, bước nhanh, đi khỏi nhanh, mình chẳng cần chi cái mớ khăn ấy, mình cần má cơ mà, dù sao giờ mình vẫn cảm ơn người ta. Hôm đó mình xem clip về nỗi nhớ người mẹ đã qua đời của một cậu bé, hôm đó là ngày 20-10, hôm đó mình viết thư về nhà.
Ừ, má ra đi, là một phần mình mãi không thể chấp nhận được, một phần mình mãi không thể tin được, thật ra mình không hiểu, tại sao điều đó lại đến với mình. Càng ngày mình càng thấy má quan trọng với mình như thế nào? Càng ngày mình càng thấy cô đơn trong cuộc sống, càng ngày mình càng cảm nhận được tình thương vô điều kiện mà mình nhận được, một may mắn, duy nhất mà mình nhận được, giờ chỉ còn mình, chỉ mãi tiếc thương.
Ừ, mất má, giá như mà mình còn cảm nhận được sự yêu thương từ ai khác, mình thấy cô đơn, đau đớn, ừ, trách mình đi...
Suốt mấy tháng qua, gần như ngày nào mình cũng khóc, mỗi lần thấy một người phụ nữ trung niên nào đó, là mình lại nghĩ đến má, má mình xứng đáng được sống lâu hơn chứ, xứng đáng được hưởng nhiều niềm vui và thoải mái hơn chứ. Vậy mà má đã đi xa mình rồi.
Hôm qua đi tập bơi, thấy một người phụ nữ Hàn, ngồi thư giãn đan len ở bên bể bơi, ngắm mấy đứa con nhỏ tập bơi. Lại gục mặt xuống, giá mà má cũng đã có được những phút giây thư giãn như vậy. Con thật tệ quá.
Má, mỗi lần lặng nghĩ đến cái danh từ ấy, nước mắt lại chảy.
Mấy tháng qua, được ở bên, quan tâm, lo lắng, thương nhớ cho một người cũng khiến mình vơi bớt đi cảm giác nhớ má. Và cũng vì những cảm giác ấy khiến cho mình lại thấy càng đau hơn, bế tắc hơn.
Hai chuyện đến với mình cùng lúc, ờ chỉ có hai chuyện thôi mà, nhưng như là hai hòn đá tảng đánh gục ngã mình. Chưa bao giờ mình nhận nhiều cảm xúc đến vậy. Hai tháng gần đây, mình như hoàn toàn bị điều khiển bởi cảm xúc của chính mình. Chẳng thể nào dùng được lý trí để kiềm hãm bớt lại, nước cứ tràn bờ, càng lúc cảm xúc càng mạnh, càng thấy cô đơn, càng thấy bế tắc...
Mình không hiểu tại sao mình lại khó nói ra cảm xúc của mình đến vậy? Giá như mình có thể, có lẽ mình sẽ ít thấy đau hơn.
Gặp lại các bạn, mọi người trách mình, sao khi má mất lại không nói cho bạn bè biết. Mọi người cứ trách mình hoài. Ừ, mình xin lỗi, nhưng mình cũng chỉ biết nói xin lỗi vậy thôi. Một phần nằm trong bản chất của mình, cứ mỗi lúc có chuyện buồn là mình chỉ muốn ôm riêng một mình, nếm lấy đau đớn. Ừ cứ tự mình ôm lấy như thế, vậy đó. Đến khi mọi việc ổn rùi, mình mới có thể nói cho mọi người.
Sorry, sorry, sorry nhiều, mình cũng muốn thay đổi, nhưng vẫn chưa làm được. Dù có gặp chuyện nữa, chắc mình cũng chỉ có thể làm như vậy.
Không nói ra được, khiến cho cái cảm xúc của mình trở nên nghẹn ngào, bế tắc hơn. Ừ, tình cảm mà lại thấy đau. Mình đã làm nên tội gì chăng?
Mình không hiểu, là phần ký ức nào trong cuộc sống, khiến sự mất mát, yêu thương và nói ra cảm xúc trở nên khó khăn với mình đến vậy?
Mình sẽ mãi cảm thấy đau đớn trong những cảm xúc này, hay là mình nên, một lần nữa, dùng lý trí để lấn át những cảm giác này xuống, một ngày nào đó, nó sẽ trở lại, và sẽ lại thấy đau hơn.
Dù sao hôm nay mình cũng cảm thấy tốt hơn một chút. Khóc mãi, quằng quại với tâm trạng mãi rùi mình cũng mình ra một chút thoả mái, tự mình tìm ra con đường để mình có thể bước đi tới. Ừ, lại phải tự mình giúp mình thôi, hình như cuộc đời mình gắn với chữ "tự..." thì phải. Mới hôm qua tự học bơi và biết bơi trong 90 phút, hihi.
Ừ, đau thì vẫn còn đó, buồn thì vẫn còn đó, câu hỏi về góc tối trong bản thân vẫn còn đó,... nhưng mình sẽ tìm được con đường đi tới... mình tin vào cuộc sống mà!
Mình vẫn ổn.
4/11/11
Implement pan/zoom feature with multi-touches screen (Part 2)
In last post, we already know how to make a proper zoom internally with OpenGL. This post will help you build a natural zooming on multi touches screen.
We will first, define how zooming gesture works with some UI tests, based on that we generalize a Mathematical problem, solve it, then go to some implementation note
If you are not interested in pan/zoom, you may find some useful info about Multitouches UI Tests, and tips for handling UITouch objects.
UI Tests
Put your fingers in Maps application, then feel the map's movement when you move your fingers. It's really intuitive and natural. You can enlarge then make it small, then large again as many times as you can, you can move the map up, move it down easily with your finger.
So, how to brief this cool feeling in detail?
A natural pan/zoom function like Maps app should pass these UI tests:
Let's say we put 2 fingers on screen at A and B, we move our finger to new points on screen A' and B'. Maps application zoom/pan have these properties:
1. Zoomed with appropriate scale with respect to how opened your finger is
The image is enlarged with a scale A'B'/AB |
2 point O and X are still under 2 fingers after zooming |
4. If 2 fingers touch the screen at different timestamp, you still can zoom.
5. Pan and zoom at the same time
6. Twist 2 finger around to form a circle, the map is not panned or zoomed
2 point O and X are still in the same place |
A simple conclusion: a natural zooming will keep 2 marks stay under your fingers in most cases
Now, pan/zoom seems more clear, but how to put these tests into code. We generalize the previous conclusion into Maths:
Equivalent Mathematical problem for pan/zoom feature.
On a plan, given 2 pair of points A, B and A', B'. How to use transformations (translation, resizing, rotation) to move A to A' and B to B'?Try to solve this yourself, or you can continue with a simple, step by step solution below:
- Second, move B1 to B2 by using a resize with origin in A', scale A'B2/A'B1
- Finally, use a Rotation with origin A', angle (A'B2, A'B') to make vector A'B2 to same direction with A'B', B2 is moved to B'
Next step, we go to implement all of these. To do this, we need to understand how touch data is transferred from your fingers and iPhone screen into your code.
Tips for handling UITouch
1. What is UITouch object?
This except from Apple iOS Event Guideline is extremely useful:
In iPhone OS, a UITouch object represents a touch, and a UIEvent object represents an event. An event object contains all touch objects for the current multi-touch sequence and can provide touch objects specific to a view or window (see Figure 3-2). A touch object is persistent for a given finger during a sequence, and UIKit mutates it as it tracks the finger throughout it. The touch attributes that change are the phase of the touch, its location in a view, its previous location, and its timestamp. Event-handling code evaluates these attributes to determine how to respond to the event. (more discussion)2. How UITouch objects sent through touchesBegan, touchesMoved, touchesEnded, touchesCanceled?
Sequence of passing objects during a series of events
UITouch | touchBegan | touchMoved | touchEnded | touchCanceled |
Put 1 finger on screen | A | |||
Move 1 | A | |||
Put another finger | B | |||
Move 2 fingers | A,B | |||
Move 2nd finger | B | |||
Put 1st finger out of screen | A |
1. Number of touches depends on event, so it is not represent how many touches are on screen
2. An UITouch object represent for a finger on screen, its data is mutable and will changed went the finger moved. You can not retain UITouch objects, thus cannot use an NSArray or NSDictionary to store touches data.
3. Number of touches go throughout touchesBegan is equal to number of touches go through touchesEnded + touchesCanceled
Pan/zoom implementation tips
- To handle how many touches are on screen, we need to remember the UITouch objects' pointers, we can use a C array of UITouch to store, and use a pointer comparison if we want to check for a pointer
Now you have all information needed for an implementation. In each UITouch delegates of your UIView, do these task:
Touches Began
- Remember UITouch objects by saving it into array
- Check touches array
- If there has 1 finger on screen, preform a pan
- If there have more than or equal to 2 fingers on screen, use our transformations to make a zoom
A' = [touch1 locationInView:self];
B = [touch2 previousLocationInView:self];
B' = [touch2 locationInView:self];
+ Translation with vector AA': AA' = (x_A' - x_A, y_A' - y_A)
Calculate B1
+ Resize at origin A', scale k = A'B'/AB, use the function we build in previous post
- (void)zoomAtPoint:(CGPoint)point scale:(CGFloat)scale;
Calculate B2
+ Rotation:
At this point we want to make rotation to bring B2 to B'. In real, we can not rotate the maps, so we will do a simple trick to bring B2 nearer to B': we perform a pan with vector B2B'/2
Touches Ended/Touches Canceled
Remove touches out of touches array
That's it! Feel free for clarification and discussion :)
Tags:
English,
iPhone,
Mobile,
Objective C,
Software Development,
Technology
2/10/11
I left my job, why and what next?
A blog about what's going on with myself…
It was a new month in Saigon, I no longer work for a company, and also not looking for any to join.
My last company is a nice place to work, with a really good salary, why did I leave?
Well, telling about my personal-why is not so natural, but this is a good point to start. For the most important reason, it's all about love. I want to do what I love the most. There had some occasions in my life which gave me a strong belief in myself that: if I love to do one thing bad enough and spend all of my time for it, then I will do it damn well.
So what I'm passionate about? First of all, I love to build things. Well, building a great product can bring you a lot of $$$, fame, blah blah, but the most reward for me is that I'm working on what I'm really passionate about, be burned by youthful energy and desire, and bring useful products as paying back to society.
I also love to learn. About "everything"! I want to deepen my knowledge about programming and also everything related to making product, selling product. I want to feel the root of software development: understand customers' problems and what imparts customers' decision to buy a product? These are things I'm not know well right now.
I'm seeking to widen my knowledge about things related to my life. Especially after bad thing happened with my family, I know that I really need to fill up the hole on my knowledge about sociality and mentality. I want to understand more about others, and know more about myself.
I want to find the reason for everything, just like I want to find the meaning of my life.
So, I'm doing work for my own, my products with some friends, and spend most of my time to learn, get direction for my next step. Sound good, however, refusing a job means getting a lot of foolish.
No job means having no one, nothing to rely on. I no longer have a simple day, wake up, feeling okay, try to work well, and waiting for "a happy $$$" end of each month. I even have no laptop, no devices to work with, have no workspace (damn, I love the Air Conditioner so much!). Everything's now on my own, I have to find a way to survive myself.
No job means living on my own saving in the bank, currently I have no income. This is expected result for what I have chosen, but on a not-so-far day, this will become a burdening on my life. What if a day, I have no more money for myself, for what I'm passionate about. I now, need to care more about how I use money. It's just not being thrifty, it is being balance between my needs and economy, what should I spend on, what should not?
Now, with no job, I'm working alone most of the time. Well, being alone is one of the worst thing. One side, that is social impart: people often say, talented people will attract other being with himself, so being alone means you are not good? Well, not really, but on a bad day, this can make you feel like a shame! I can seek for some friends to form a working group, but I really don't want to do like that when I still not define my own road, my vision.
On another side, alone means you have to struggle with your bad side. Like other normal guy, I have quite a lot of weaknesses. That is being lazily, being slowly when working, and procrastinating on unfamiliar decision, and being self-satisfied with WTH I'm doing, being free to do random, unnecessary tasks when there have no outer pushing force… Well, I experienced all of these in recent days.
So can I move forward when there has no one pushing me on my back? Or I just end up with self-satisfaction and wasting my current valuable youthful life? Well, I have to learn to manage myself, learn to set goals. I myself need to push me forward. To be very honest, I'm really lazy on this. Please remind me, ask me my progress, if you can help.
And the most important thing, I have no idea what should go next? No clear direction, no vision, no plan for my next 5 years: What do I want to be? How do it look like? How do I achieve it? A lucky things is that, I know clearly that finding a reasonable answers for these questions is my ultimate goal for next few months.
Seem that I have a lot of things to learn, now I'm dealing with the disadvantage of too-much learning: being unrealistic guy! I really don't want to waste my time and only know thing in theory. My friends are out there, working endlessly for new achievement. I'm here, learn!
You may ask me that, why don't you focus to learn more, read more now, but going to your blog and blah blah. Well, I write this post, honestly because I need help! I need to be pushed. I write my life transparently as a commitment that I will try my best to overcome this situation. I need reality check, blogging is a good checking and getting feedback from friends.
Be bold, or be careless?
Well, I'm taking a big risk for my own life, what I get after all maybe delusion or being disappointed. I hope I will have full of self-awareness to avoid the worst and choose the best for my daily and future.
Falling in love, being passionate, being self-aware, being visionary, being bold.
A new journey.
Stay hungry, stay foolish!
21/9/11
100 ngày của má
Một ngày không làm việc, một ngày đi tìm cho con một khoảng bình yên, một ngày con dành để lắp ghép lại những cảm giác đã đến với con những ngày qua, những giây phút mà con mãi không muốn bao giờ quên.
Ân hận. Má mất, trong con tràn ngập những ân hận. Con khóc, con giận, bởi có quá nhiều điều con đã chưa làm được, muốn làm cho má, mà giờ con đành nhìn bất lực. Giá như con đã có thể giúp cho cuộc sống của má nhẹ nhàng hơn. Má mang lại cho con bao điều tốt đẹp, giờ con biết làm sao để báo đáp lại những điều đó...
Là tiếc nhớ, má ra đi, trong nhà vẫn còn đầy ắp hình bóng má, nhà trên, nhà dưới, dưới bếp, đằng sau, chỗ nào cũng khiến con bậc khóc, những điều má chắt chiu, những điều má yêu quý, giờ vật còn đây mà người đã tan về đâu.
6 năm con đi xa má, 6 năm để con chợt dừng lại không mãi bay về phía xa, 6 năm để con học được 1 điều, 6 năm để con biết mình có một niềm yêu thương cao cả ở quê nhà, 6 năm để con biết lo cho ba má.
Con đã xa nhà, 6 năm, 6 năm sau con trở lại má đã xa con rồi.
Thời gian, mọi người thường nói nỗi đau cần có thời gian, còn con sợ thời gian, con sợ thời gian làm mờ đi hình ảnh má, xoá đi nỗi đau này trong con. Đó là điều khủng khiếp mà con sẽ cố gắng chiến đấu, con không thể quên những đau khổ mà những người xung quanh đã và đang phải chịu đựng để con có mỗi ngày thức dậy và bước đi.
Sẽ chẳng biết bao giờ con mới thôi hết ân hận về những gì con chưa làm được cho má. Tương lai phía trước là những khoảng chưa xác định, nhưng dù sao đi chăng nữa, con cũng sẽ cố gắng sống một cuộc sống có ý nghĩa, để cuộc đời ba má sẽ thật ý nghĩa, vì những hy sinh đã dành cho con.
Ân hận. Má mất, trong con tràn ngập những ân hận. Con khóc, con giận, bởi có quá nhiều điều con đã chưa làm được, muốn làm cho má, mà giờ con đành nhìn bất lực. Giá như con đã có thể giúp cho cuộc sống của má nhẹ nhàng hơn. Má mang lại cho con bao điều tốt đẹp, giờ con biết làm sao để báo đáp lại những điều đó...
Là tiếc nhớ, má ra đi, trong nhà vẫn còn đầy ắp hình bóng má, nhà trên, nhà dưới, dưới bếp, đằng sau, chỗ nào cũng khiến con bậc khóc, những điều má chắt chiu, những điều má yêu quý, giờ vật còn đây mà người đã tan về đâu.
6 năm con đi xa má, 6 năm để con chợt dừng lại không mãi bay về phía xa, 6 năm để con học được 1 điều, 6 năm để con biết mình có một niềm yêu thương cao cả ở quê nhà, 6 năm để con biết lo cho ba má.
Con đã xa nhà, 6 năm, 6 năm sau con trở lại má đã xa con rồi.
Thời gian, mọi người thường nói nỗi đau cần có thời gian, còn con sợ thời gian, con sợ thời gian làm mờ đi hình ảnh má, xoá đi nỗi đau này trong con. Đó là điều khủng khiếp mà con sẽ cố gắng chiến đấu, con không thể quên những đau khổ mà những người xung quanh đã và đang phải chịu đựng để con có mỗi ngày thức dậy và bước đi.
Một ngày con lớn, một ngày con khôn, một ngày con biết thương cho mẹ
Sẽ chẳng biết bao giờ con mới thôi hết ân hận về những gì con chưa làm được cho má. Tương lai phía trước là những khoảng chưa xác định, nhưng dù sao đi chăng nữa, con cũng sẽ cố gắng sống một cuộc sống có ý nghĩa, để cuộc đời ba má sẽ thật ý nghĩa, vì những hy sinh đã dành cho con.
19/9/11
Implement pan/zoom feature with multi-touches screen (Part 1)
(Image source: top9tip.com) |
When Apple rolled out it multi-touches device - the iPhone, they also defined some useful, intuitive gestures for a certain purposes like pinch to zoom, pan to moving around in many of apps like Photos, Maps. These gestures become industry standard for their tasks and even used more and more in other apps like pinch to open/close an article in Flipboard..., pan/zoom in drawing app and game like Happy Farm...
This post will give you some ideas on how to implement your own pan/zoom.
Platform: iOS - OpenGL
OpenGL pre-configuration: Draw an off-screen texture to an onscreen frame buffer EAGLView
Texture ------> onscreen FBO ---> render buffer -> context
We can understand the task easier and get it done by simplifying it into smaller steps:Step 1: Implement simple and acceptable Zoom/Pan function
Goal
A simple pan/zoom function, you can zoom & pan to any point of the drawing.
Technical
We define a pan by using a vector, and a zoom by a scale number. Let’s store these values in a struct:
typedef struct {OpenGL
GLfloat x;
GLfloat y;
GLfloat zoom;
} Transforms;
// Where (x, y) is panning vector, and zoom is zooming scale level.
You can change make our draw bigger with glScalef, and move it by a vector with glTranslatef:.
We need to modify the params of glTranslatef and glScalef when drawing view:
glTranslatef(transforms.x/screenWidth, - transforms.y/screenHeight, 0);
glScalef(transforms.zoom, transforms.zoom, 1.0);Multitouches
To glue these internal settings with multitouches gesture:
- In your touchesMoved:withEvent: methods, check if event touches included 1 or 2 touches
For pan: Apply for event with 1 touch (which moved from point A to point A_ in screen), get pan's vector by:
touch1 = [[touches allObjects] objectAtIndex:0];For zoom: Apply for event with 2 touches
A = [touch1 previousLocationInView:self];
A_ = [touch1 locationInView:self];
(transform.x, transform.y) = panning vector = vector AA_
Similarly, calculating locations for touch2: B & B_
transforms.zoom = zooming scale = A_B_ / ABResult
Now you have a good enough pan/zoom, you can zoom and go to any point of the drawing.
You also may notice that depend your OpenGL configuration (in iOS or MacOSX) then your view will be always zoomed at center or lower left corner. A point at a corner after being zoomed will be moved out of the screen.
To make the drawing zoom at a corner:
• We first make a zoom at center of screen.
• Then drag/perform pan drawing to the corner.
Step 2: Make it better - Implement zooming at any point on drawing
Goal
Open Maps app, when you double click at any point, the map will be zoomed right at that point, even if that point is in a corner How to make a zooming like that?
We are going to build zooming function at a point:
- (void)zoomAtPoint:(CGPoint)point scale:(CGFloat)scale;This method will modify transform setting appropriately when program receive zoom gestures
A simple thought to solve this is to utilize code in step 1, and add an appropriate pan right after a zoom.
Technical
Remember we have an off-screen texture, then we draw it on an on-screen frame buffer, again this buffer will be rendered to the view. This means we have 3 layers which affect how a drawing is displayed.
In which layer will zooming (the drawing is double in size) actually happen?
In Step 1, we know that transforms.zoom is used for glScalef, and this function will take effect when texture is drawn into onscreen frame buffer. In this process, zooming effect is actually happened
So, why do last time we always zoom on center of the screen?
That is happened when the double drawing is rendered into the view, OpenGLES 3D coordinate system has origin at the center of the screen (while in Mac OSX, this origin is in lower left corner of the screen)
Thus, after we double click on a point in screen, that point is not displayed under our finger in screen anymore, but is moved farther the center of the screen
We need to pan that point from Ao to A (vector AoA), but how to know the coordinate of Ao?
To do this, we need to go deeper into 3 layers of displaying. Let’s name some points:
• A_w, Ao_w: coordination of A and Ao in view layer (which is also A and Ao)
• A_d, Ao_d: actually coordination of A and Ao in the draw, without any affect display of zoomed/panned drawing
• A_t, Ao_t: coordination of A and Ao in the texture, zoom double affect will be performed on A_t point
Follow this sequence of transformation to know coordination of Ao
A_w
--transform/remove pan-zoom effect--> A_d
--transform/convertToGL--> A_t
--zoom at center--> Ao_t
--transform/convert GL to view--> Ao_d
--apply pan-zoom affect--> Ao_w
Create function for each steps, take into account the difference between coordinate of each layers:
• View: origin at lower - left corner
• On-screen buffer: origin at center
• Texture: origin at top - left corner
This is one of a tough part of implementation, it requires a little knowledge about mathematic and coordinate transform. Try to have unit test and make sure each task done correctly before jump into next task. Below is instruction for first transforms: remove pan-zoom effect
//I. Remove panning
x -= transforms.x;
y -= transforms.y;
/*II. Remove zooming
1. Move from bottom-left to center
2. scale with current zoom (not new zoom caused by double click)
3. move from center back to bottom-left */
x = (x - screenWidth/2)/transforms.zoom + screenWidth/2;
y = (y - screenHeight/2)/transforms.zoom + screenHeight/2;
You can find the idea for the second here: convertToGL, the forth and fifth is the opposite transform of the first and second one.
When you get all point converting done correct, perform a pan with vector AoA will bring Ao back to under your finger. Eureka!
Step 3: Make it feel cool like Maps app - Integrate multi-touches gestures: pinch to zoom
(to be continued)
Tags:
English,
iPhone,
Mobile,
Objective C,
Software Development,
Technology
12/9/11
Ý nghĩa cuộc sống là gì? (Phần 2)
Đó là câu hỏi mà lời giải sẽ được hé mở dần trong cuộc đời mỗi người. Là một góc nhỏ mà mỗi khi có cơ hội bạn lại lục ra nhâm nhi nghiền ngẫm.
Tôi tuổi 25, đối diện với cái chết của những người xung quanh, những người đã mãi mãi ra đi, dù tôi có muôn ngàn lần không muốn tin điều đó lại xảy ra.
Chợt nhận ra, rồi một ngày nào đó không xa tôi cũng sẽ chết đi.
Điều đó không khiến tôi buồn, tôi sợ mà khiến tôi tự hỏi mình: Con người ta sinh ra, rồi lại tan mất đi, vậy rốt cuộc tôi sinh ra để làm gì?
Liệu những năm tháng sống cùng mọi người của tôi có mang lại ý nghĩa gì không?
Đã có ai tự hỏi và tìm ra cho mình câu trả lời đích thực cho bản thân chưa? Hẳn là có, nhưng cũng có nhiều người chưa, trong đó có tôi. Bởi vì…
Những mục tiêu
Trong cuộc sống tất bật, chân - giả lẫn lộn này, người ta dễ bị cuốn xa khỏi câu hỏi đó. Bởi, hoặc ta mãi vật lộn, quay cuồng trong vòng xoay cơm áo gạo tiền, hoặc chăm lo xây dựng lớp vỏ hào nhoáng vật chất bên ngoài như quần áo đẹp, điện thoại đẹp, nhà đẹp,… bạn trai, bạn gái đẹp,… tiền tài, danh vọng,… hoặc ta chú tâm thoả mãn những cảm xúc dục vọng của mình… Tất cả những điều đó chẳng bao giờ thấy đủ, khiến ta chẳng khi nào có phút nhìn lại chính mình, thấy được rốt cuộc bản thân ta đạt được tất cả những điều trên để làm cái gì?
Nhìn quanh ta, những vật mà ta yêu quý đều mang lại cho ta những ý nghĩa, giá trị nào đó? Cuốn sách ta đọc giúp ta hiểu nhiều hơn về cuộc sống, nhờ cái đồng hồ bên cạnh mà ta giữ được đúng hẹn với bạn bè, quần áo đẹp giúp ta lịch sự, hay tự tin hơn với mọi người. Vậy còn chính bản thân ta? Bản thân ta mang lại ý nghĩa gì?
Chúng ta tự đặt cho mình muôn vàn mục tiêu mà lại không biết, rốt cuộc những mục tiêu đó mang lại ý nghĩa gì?
Có bạn bảo rằng, đạt được những mục tiêu trên, khiến cho ta vui, ta thoả mãn, vậy là được rồi.
Nhưng mà, cuộc sống của ta đâu chỉ có mỗi ta…
Nhận từ thế hệ trước, cho đi thế hệ sau
Cuộc sống quanh ta là 1 dòng chảy, hết thế hệ này đến thế hệ kia, trong dòng chảy đó mỗi chúng ta dần hiểu ra 1 quy luật sống: Có qua có lại - có nhận lại, có cho đi.
Bạn nghĩ sao về một kẻ chỉ biết nhận lại, bao nhiêu cũng về mình và vì mình; mà lại chẳng từng cho đi 1 cái gì đó.
Có những sự cho đi vô bờ bến, không cần sự đáp lại: từ những ngày bé nhỏ, ta nhận được biết bao tình thương và sự chăm sóc của cha mẹ. Ngày nào đó, đến lượt ta, ta hãy dành hết tình yêu và tương lai cho một thế hệ mới
Cũng có những sự nhận lấy rất nhẹ nhàng, đôi khi ta quên mất rằng ta đã may mắn hơn rất nhiều bạn thế hệ trước, không phải chiến đấu với bệnh tật (vì ta đã có bao loại vắc-xin), không phải vật lộn với đói khát (vì xã hội đã sản xuất được nhiều thực phẩm hơn), không phải đối mặt với bom mìn chết chóc (vì đã có những hy sinh thầm lặng, giữ cho ta yên bình). Một ngày trời nóng, được ngồi dễ chịu trong 1 phòng máy lạnh, ta có nghĩ về một người nào đó đã nghĩ ra chiếc máy lạnh, ông ấy hẳn đã làm một điều hữu ích cho người khác. Cái mà ông ta để lại, thật là tuyệt cho chính ta lúc này. Chắc hẳn nếu ai cũng chỉ có sinh ra và chết đi cho riêng mình, liệu ta có được thoả mái như ngày nay, hay tất cả chúng ta vẫn phải vào rừng hái lợm.
Để từ đó ta hiểu rằng, lý do mà ta có mặt trên cuộc đời này là vì ta sẽ mang lại những ý nghĩa, giá trị cho những người quanh ta, và cho những gì mà ta đã nhận được.
Cuộc sống trở nên có ý nghĩa hơn khi ta biết cho đi.
Những điều này liệu có lý thuyết quá không, có giáo điều quá không? Không, tất cả thật sự đơn giản, chỉ xuất phát từ hai chữ cho - nhận.
Nhưng đâu phải ai cũng có thể làm được điều đó, tôi còn bao nhiêu điều phải lo cho cuộc sống này, đâu phải dễ khi nói đến chuyện cho đi? Bạn biết không, hãy bắt đầu từ những điều rất nhỏ nhặt: thêm vào những mục tiêu của mình 1 chút ý nghĩa.
Những mục tiêu có ý nghĩa
Mỗi chúng ta hẳn đã có những mục tiêu của mình trong cuộc sống, nó là động lực để mỗi ngày thức dậy ta cảm thấy sức sống trong những công việc mà ta yêu thích, cùng những người mà ta yêu mến; là những nấc thang để ta biết rằng mỗi ngày qua, ta đã tiến bộ hơn những ngày trước, là những hạt giống để ta có được cuộc sống thoả mái hơn sau này, và cũng là niềm tin để ta tin tưởng vào một tương lai tốt đẹp hơn. Điều đó thật tuyệt vời, nhưng nó càng tuyệt hơn nếu ta dành một phần những điều tuyệt vời đó cho những người quanh ta.
- Bạn mong rằng mình sẽ kiếm được thật nhiều tiền, và bạn đã có biết bao nhiêu may mắn để biến điều đó thành hiện thực, hãy giúp những người bất hạnh hơn quanh bạn.
- Bạn là người sản xuất những sản phẩm, hãy mang lại những sản phẩm hữu ích, góp phần giúp thế giới này trở nên tốt đẹp hơn, dù với những thay đổi rất nhỏ bé.
- Bạn đi dạy học, hãy mang lại cho những đứa trẻ kia những điều tốt đẹp nhất, để một mai không xa hôm nay, chúng cũng sẽ làm nên những điều ý nghĩa cho cuộc sống.
- Là người buôn bán, hãy nghĩ đến những điều bạn có thể giúp, có thể tư vấn và mang lại những lựa chọn tốt nhất cho những khách hàng của bạn.
- Một ngày nào đó, bạn thấy vui vì nhận được sự giúp đỡ từ một người xa lạ, hãy làm 1 việc nhỏ để nối tiếp niềm vui ấy cho những người cần giúp đỡ quanh bạn.
Hãy mang lại cho mục tiêu của bạn những ý nghĩa
và hãy mang lại cho cuộc sống của chính bạn: những mục tiêu ý nghĩa.
Đăng ký:
Bài đăng (Atom)